18. juli 2002 - 22:19Der er
21 kommentarer og 1 løsning
tricky rapport
Jeg har en tabel med kunder i(kundeoplysninger), hver kunde har x biler (tabel: biler) til knyttet, og på hver bil kan der være 1 til 4 termin, hver der står måneden terminen skal falde (gemt med tal, da det hentes fra en måned tabel)
Jeg vil gerne have en rapport der viser: elle måneder på en række (januar til december) helt til venstre står hver kunde med sit kundenr, og under kunden står de tilknyttede biler. Har bilen så fx. termin i juni, står terminspræmien under juni. Har bilen termin i januar og juli står terminspræmien under både januar og juli, osv. Terminpræmien skulle gerne lægges sammen i bunden, så man kan se hver meget der skal betales i termin i januar, februar osv.
Først laves en UNION således at der fåes en tabel: KundeID, TerminId, Præmie:
SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[1 Termin] as termin, Biler.Terminspræmie FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid UNION all SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[2 Termin], Biler.Terminspræmie FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid UNION all SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[3 Termin], Biler.Terminspræmie FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid UNION ALL SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[4 Termin], Biler.Terminspræmie FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid;
Derefter krydsTabulering TRANSFORM Sum(Q_AlleTerminer_1.Terminspræmie) AS SumOfTerminspræmie SELECT Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid FROM (Q_AlleTerminer AS Q_AlleTerminer_1 LEFT JOIN Måned ON Q_AlleTerminer_1.termin = Måned.nr) INNER JOIN Kundeoplysninger ON Q_AlleTerminer_1.kundeid = Kundeoplysninger.kundeid GROUP BY Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid ORDER BY Måned.nr PIVOT Måned.nr;
det ser meget godt ud. Bare lige en ting. Kan jeg få lagt terminspræmien sammen pr måned, så der i januar står 1000, februar 20000 i en række for sig selv nedefor neden?
Har du brug for flere felter i din rapport trækker du dem bare ned i foresp gitteret 'Q_rpt' som rækkeoverskrift.
Du kan også tilføje tabellen 'biler' og trække eks. 'bilmærke' ned - slet dog nogen af alle relationerne, således der kun er relateret mellem 'biler' og 'Q_AlleTerminer'
ok, så har jeg fået kigget lidt mere på det, og har fundet en lille fejl. November vises ikke i rapporten, og jeg kan ikke vælge den. Så vidt jeg kan se skyldes det at der ikke er nogen biler der har termin i denne måned, men jeg vil gerne have den på alligevel.
JA - Jeg har vendt et outerJoin forkert, Desuden er der lidt jeg ikke har tænkt på - måned '0' ???? - Det må være et normaliserings problem ;o)
Q_AlleTerminer: SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[1 Termin] as termin, Biler.Terminspræmie FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid WHERE Biler.[1 Termin] between 1 and 12 UNION all SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[2 Termin], Biler.Terminspræmie FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid WHERE Biler.[2 Termin] between 1 and 12 UNION all SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[3 Termin], Biler.Terminspræmie FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid WHERE Biler.[3 Termin] between 1 and 12 UNION ALL SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[4 Termin], Biler.Terminspræmie FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid WHERE Biler.[4 Termin] between 1 and 12;
og Q_rpt: TRANSFORM Sum(Q_AlleTerminer_1.Terminspræmie) AS SumOfTerminspræmie SELECT Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid, Biler.Bilmærke FROM ((Q_AlleTerminer AS Q_AlleTerminer_1 RIGHT JOIN Måned ON Q_AlleTerminer_1.termin = Måned.nr) LEFT JOIN Kundeoplysninger ON Q_AlleTerminer_1.kundeid = Kundeoplysninger.kundeid) LEFT JOIN Biler ON Q_AlleTerminer_1.bilid = Biler.bilid WHERE (((Kundeoplysninger.kundeid) Is Not Null)) GROUP BY Kundeoplysninger.kundeid, Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid, Biler.Bilmærke ORDER BY Måned.nr PIVOT Måned.nr;
Du skal bare klippe og klistre de ovenstående SQL'er ind i dine foresp.
rettelse: og Q_rpt: TRANSFORM Sum(Q_AlleTerminer_1.Terminspræmie) AS SumOfTerminspræmie SELECT Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid, Biler.Bilmærke FROM ((Q_AlleTerminer AS Q_AlleTerminer_1 RIGHT JOIN Måned ON Q_AlleTerminer_1.termin = Måned.nr) LEFT JOIN Kundeoplysninger ON Q_AlleTerminer_1.kundeid = Kundeoplysninger.kundeid) LEFT JOIN Biler ON Q_AlleTerminer_1.bilid = Biler.bilid GROUP BY Kundeoplysninger.kundeid, Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid, Biler.Bilmærke ORDER BY Måned.nr PIVOT Måned.nr;
felterne [1 termin], [2 termin], osv i tabellen 'biler', indeholder flere steder værdien 0. Da disse felter er relateret til 'måned', som IKKE har et recordset med værdien 0, er der lidt kludder i tabelstrukturen. Det behøves/er ikke noget problem, blot man er opmærksom på det.
hmmm, såvidt jeg kan se har 1-4 termin enten et tal mellem 1 og 12, eller også står der ikke noget der i. Altså ingen med 0. Men skidt med det.
Jeg har lige et par spm. mere: Jeg har sat sum til =sum([1]) osv. ved alle måneder, og det virker fint, men hvis der er en måned uden terminspræmier, kommer der ikke til at stå 0 i sum, den forsvinder helt. Kan jeg få den til at skrive et 0? JEg har også lavet en total sum på denne måde: =Sum([1])+Sum([2])+Sum([3])+Sum([4])+Sum([5])+Sum([6])+Sum([7])+Sum([8])+Sum([9])+Sum([10])+Sum([11])+Sum([12]) Kan det gøres lettere? også her går det galt hvis den er en måned uden terminspræmier, så forsvinder total summen også?
Du kan lave en foresp mere med udgangspunkt i Q_Rpt, hvor du trækker alle felter ned i foresp.giteret. Felterne 1 - 12 skrives sådan her: jan: nz([1];0) feb: nz([2];0) osv. Så vil de få værdien 0 istedet for null, og dine beregninger i rapporten vil være OK. Dog skal dine udtryk i rapporten modificeres: =Sum([jan])+Sum([feb])+ .....
Du kan også vælge at bruge nz() direkte i rapporten: =nz(Sum([1]);0)+nz(Sum([2]);0)+ .....
Jeg kender desværre ikke nogen 'nem' måde, måske kunne du oprette et nyt spm. for at få andre 'eksperter' på banen
hvis jeg nu runder op til 200, kan du så hjælpe mig engang til?
Jeg har lavet en tilsvarende rapport til at vise ea (erhvervsansvar) præmie betalinger, som virker fint. Men jeg har et lille problem. Der er nogle eapræmie som som træder i kraft om et par år, jeg vil derfor ikke have dem med i rapporten. Jeg har derfor tilføjet en WHERE (Kundeoplysninger.eaikraft < now) linie i forespørglsen, så den ser således ud:
TRANSFORM Sum(Kundeoplysninger.eapræmie) AS SumOfTerminspræmie SELECT Kundeoplysninger.kundeid FROM Kundeoplysninger RIGHT JOIN Måned ON Kundeoplysninger.eahoved = Måned.nr WHERE (Kundeoplysninger.eaikraft < now) GROUP BY Kundeoplysninger.kundeid ORDER BY Måned.nr PIVOT Måned.nr;
men så får jeg (igen) ikke alle måneder med, jeg får kun de måneder der er betalinger i. Hvis ikke WHERE linien er med, vises alle måneder. Hvad skal laves om?
Og lige en xtra ting: eaikraft skrives som dd-mm-åååå (21-07-2002), og jeg vil gerne have at rapporten/forespørgslen vises dem der træder i kraft i hele 2002 og ikke bare now. Hvis du forstår?
Du får jeg de måneder der er trådt/træder i kraft i 2002 hvilket er juni, juli, september og november) og de mdr. som der ikke er nogle betalinger i (heller ikke i dem som først træder i kraft senere), hvilke er marts, maj august, oktober og december.
Men jeg mangler Januar, februar og april, som, har jeg fundet ud af, er de måneder som eksistere i de kunder som ikke tages med da de først træder i kraft senere end 2002.
TRANSFORM Sum(IIf(Year(Now())>=Year([eaikraft]),[eaikraft],Null)) AS SumOfTerminspræmie SELECT Kundeoplysninger.kundeid FROM Kundeoplysninger RIGHT JOIN Måned ON Kundeoplysninger.eahoved = Måned.nr GROUP BY Kundeoplysninger.kundeid ORDER BY Måned.nr PIVOT Måned.nr;
Du kan også lave din krydstabulering helt uden kriterier. og derefter lave en ny foresp hvor du udvælger dem du vil ha' med
SELECT Forespørgsel1.* FROM Forespørgsel1 INNER JOIN Kundeoplysninger ON Forespørgsel1.kundeid = Kundeoplysninger.kundeid WHERE (((Year([eaikraft]))<=Year(Now())));
hvor Forespørgsel1 er krydstabulering UDEN kriterier.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.