Avatar billede speder2 Nybegynder
25. maj 2002 - 13:10 Der er 7 kommentarer og
1 løsning

En lidt kompleks SQL

Jeg har følgende to tabeller:

TABEL: projekter
Id    projektnavn    forbrugmax1    forbrugmax2    forbrugmax3
1    projekt1    145        100        87
2    projekt2    213        98        111

TABEL: transaktioner
Id    dato            projektid    forbrug1    forbrug2    forbrug3
1    22-05-2001 12:10:00    1        100        76        23
2    23-05-2001 11:55:00    2        105        87        43
3    26-05-2001 23:11:00    2        116        23        65
4    27-05-2001 08:06:00    2        123        34        111
5    28-05-2001 05:13:00    1        176        132        54


Og vil gerne generere følgende tabel udfra de to ovenstående:


Projekt    Forbrugstype    Procent
1    forbrug1    121 (=176/145*100)
1    forbrug2    132 (=132/100*100)
1    forbrug3    62 (54/87*100)   
2    forbrug1    58 (123/213*100)
2    forbrug2    35 (34/98*100)
2    forbrug3    100 (111/111*100)


Hvordan? Bemærk, at det KUN er den nyeste transaktion for hvert projekt, som er interessant (id=1 og id=4 i transaktioner). Kalkulationen i Procent er ganske enkelt forbrug1/2/3 divideret med forbrugmax1/2/3 gange med 100.

Der må gerne være to forespørgsler, men det hele skulle gerne laves i rent SQL.

M.v.h.

Søren


Avatar billede terry Ekspert
25. maj 2002 - 13:48 #1
Hi Søren I will take a look if yiu can send the dB to terry@santhell.dk
Avatar billede terry Ekspert
25. maj 2002 - 14:10 #2
Søren, IF you do send it to me, then I will take a look when I get tiem, off out for a while!
Avatar billede hansk Nybegynder
25. maj 2002 - 15:16 #3
Hej Søren,
Du kan lave det via 2 SQL's. Først laver du et view som giver dig maxdate pr projekt:

SELECT Transaktioner.ProjektID, Max(Transaktioner.dato) AS MaxOfdato
FROM Transaktioner GROUP BY Transaktioner.ProjektID;
Gem dette som qMaxDate.

Derefter selekterer du på basis af de to tabeller samt det nye view:

SELECT Projekter.projektnavn, [forbrug1]/[forbrugmax1]*100 AS Pct1,[forbrug2]/[forbrugmax2]*100 AS Pct2,[forbrug3]/[forbrugmax3]*100 AS Pct3
FROM (Projekter INNER JOIN qMaxDate ON Projekter.id = qMaxDate.ProjektID) INNER JOIN Transaktioner ON (qMaxDate.MaxOfdato = Transaktioner.dato) AND (Projekter.id = Transaktioner.ProjektID);

Denne løsning giver dig alle beregninger på 2 linier, 1 linie pr projekt.

Hvis du vil have det splittet op i 6 linier kan dette også lade sig gøre ved at den anden sql laves som union af 3 sql'er.
Avatar billede hansk Nybegynder
25. maj 2002 - 15:20 #4
Med lidt klippe klistre:

SELECT Projekter.projektnavn, "forbrug1", [forbrug1]/[forbrugmax1]*100 AS Pct
FROM (Projekter INNER JOIN qMaxDate ON Projekter.id = qMaxDate.ProjektID) INNER JOIN Transaktioner ON (qMaxDate.MaxOfdato = Transaktioner.dato) AND (Projekter.id = Transaktioner.ProjektID)
UNION ALL
SELECT Projekter.projektnavn, "forbrug2", [forbrug2]/[forbrugmax2]*100
FROM (Projekter INNER JOIN qMaxDate ON Projekter.id = qMaxDate.ProjektID) INNER JOIN Transaktioner ON (qMaxDate.MaxOfdato = Transaktioner.dato) AND (Projekter.id = Transaktioner.ProjektID)
UNION ALL
SELECT Projekter.projektnavn,  "forbrug3",[forbrug3]/[forbrugmax3]*100
FROM (Projekter INNER JOIN qMaxDate ON Projekter.id = qMaxDate.ProjektID) INNER JOIN Transaktioner ON (qMaxDate.MaxOfdato = Transaktioner.dato) AND (Projekter.id = Transaktioner.ProjektID);
Avatar billede speder2 Nybegynder
25. maj 2002 - 15:24 #5
det ser næsten rigtigt ud - det giver følgende:

projektnavn    Expr1001    Pct
projekt2    forbrug1    57,7464788732394
projekt1    forbrug1    121,379310344828
projekt2    forbrug2    34,6938775510204
projekt1    forbrug2    132
projekt2    forbrug3    100
projekt1    forbrug3    62,0689655172414

Kunne jeg få dig til at sortere den så der først sorteres på projekt, og dernæst på forbrug, så den passer helt nøjagtigt. Undskyld jeg er lidt pedantisk, men forespørgsel skal sendes til et grafmodul, og den kokser, hvis den ikke kommer i helt nøjagtigt format.
Avatar billede speder2 Nybegynder
25. maj 2002 - 15:25 #6
og og og - kan man afrunde procentsatserne?
Avatar billede speder2 Nybegynder
25. maj 2002 - 17:00 #7
Fandt ud af det. Takker :-)
Avatar billede hansk Nybegynder
25. maj 2002 - 17:14 #8
Takker selv.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester