26. august 2005 - 14:40Der er
5 kommentarer og 1 løsning
Sum af felt udfra kriterier i andet felt
Hej,
Jeg er ved at lave en query i "microsoft query" og al fungerer som det skal, men jeg har lige en ting jeg ikke kan finde ud af.
Jeg har x antal forskellige varer som er indkøbt og i min query kommer der en linie for hver købsordre, disse vil jeg gerne have summeret så der står en linie pr. vare og et felt med total køb (i stedet for måske 10 linier hvis varen er hjemkøbt 10 gange)
Uden at kende din database er det lidt svært at sige helt præcist hvordan det skal være, men helt basalt kunne det f.eks. være sådan her:
SELECT v.Varenr, v.Varetekst, v.Stykpris, SUM(k.KøbtAntal) AS TotaltAntal, SUM(k.KøbtAntal) * v.Stykpris AS TotaltBeløb, COUNT(*) AS AntalKøb FROM Varer v INNER JOIN Købsordrer k ON v.Varenr = k.Varenr WHERE v.Varenr < 10000 GROUP BY v.Varenr, v.Varetekst, v.Stykpris
Husk at sætte alle felter i din SELECT som ikke benytter aggregate funktioner (SUM, COUNT, AVG mm.) på din GROUP BY
Hvis du ønsker at tilføje en udvælgelse baseret på resultatet af f.eks. din sum på KøbtAntal, kan du ikke gøre det med en WHERE selektion. Så skal det gøres med en HAVING, så også placeres efter din GROUP BY:
SELECT v.Varenr, v.Varetekst, v.Stykpris, SUM(k.KøbtAntal) AS TotaltAntal, SUM(k.KøbtAntal) * v.Stykpris AS TotaltBeløb, COUNT(*) AS AntalKøb FROM Varer v INNER JOIN Købsordrer k ON v.Varenr = k.Varenr WHERE v.Varenr < 10000 GROUP BY v.Varenr, v.Varetekst, v.Stykpris HAVING SUM(k.KøbtAntal) > 50
Ja, jeg kan godt se at jeg ikke helt har givet informationer nok, her kommer alt hvad jeg har:
SELECT Købsleverancelinie.Bilagsnr_, Købsleverancelinie.Leverandørnr_, Købsleverancelinie.Nummer, Sum(Købsleverancelinie.Antal), Købsleverancelinie.Ordrenr_, Købsleverancelinie."Ønsket modtagelsesdato", Vare.Lager FROM Købsleverancelinie Købsleverancelinie, Vare Vare WHERE Vare.Nummer = Købsleverancelinie.Nummer AND ((Købsleverancelinie.Leverandørnr_='11111111')) GROUP BY Købsleverancelinie.Bilagsnr_, Købsleverancelinie.Leverandørnr_, Købsleverancelinie.Nummer, Købsleverancelinie.Ordrenr_, Købsleverancelinie."Ønsket modtagelsesdato", Vare.Lager HAVING (Købsleverancelinie."Ønsket modtagelsesdato">{d '2004-07-30'})
Og det giver følgende: f.eks. har vi hjemkøbt vare ("nummer" 324252) 12 gange siden 30/7-04 det giver 12 linier med "antal" dem vil jeg godt have summeret til en linie pr. "nummer" i stedet for 12 linier.
Ja, du har jo da ihvert fald fået GROUP BY rigtigt i den forstand, at du har alle de felter med, som ikke bruger en aggregat funktion. Så vidt, så godt. Men; jeg tror ikke du kan have f.eks. bilagsnr. med i din SQL. Det vil jo nok variere for hver købt linie (idet jeg formoder, varen er købt på flere forskellige bilag). Du kan enten lade være med at tage feltet med, eller bruge en aggregat funktion på feltet (MIN, MAX, AVG eller lign.). Umiddelbart synes jeg ikke du kan bruge det til noget i denne sammenhæng. Det samme gælder for de fleste af de andre felter, som sandsynligvis også vil være forskellige for hvert indkøb, så derfor er mit forslag:
SELECT Købsleverancelinie.Leverandørnr_, Købsleverancelinie.Nummer, Sum(Købsleverancelinie.Antal), Vare.Lager FROM Købsleverancelinie Købsleverancelinie, Vare Vare WHERE Vare.Nummer = Købsleverancelinie.Nummer AND ((Købsleverancelinie.Leverandørnr_='11111111')) AND (Købsleverancelinie."Ønsket modtagelsesdato">{d '2004-07-30'}) GROUP BY Købsleverancelinie.Leverandørnr_, Købsleverancelinie.Nummer, Vare.Lager
Jeg burde nok selv kunne have set det med bilagsnr. + ordrenr., men da jeg jo er SQL novice og kun tænkte på at få sql'en til at virke blev jeg "lidt" blind.
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.