Avatar billede ogodt Nybegynder
26. august 2005 - 14:40 Der 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)

Det skal laves i SQL.

Håber der er nogen der kan hjælpe mig
Avatar billede claesdamlund Nybegynder
26. august 2005 - 23:33 #1
Gruppér efter Ordre, Vare og lav en sum på beløb.

(Hvis der er købt 10 stk. af den samme vare på en given ordre, har du da forhåbentlig ikke 10 tilhørende ordrelinier???)
Avatar billede kjulius Novice
27. august 2005 - 01:33 #2
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

Jeg håber det hjalp lidt...
Avatar billede ogodt Nybegynder
29. august 2005 - 09:30 #3
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.

jeg håber det gav lidt mere.
Avatar billede kjulius Novice
29. august 2005 - 22:26 #4
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
Avatar billede ogodt Nybegynder
30. august 2005 - 09:15 #5
Ja med fare for at gentage mig selv: YOU ROCK :-)

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.

Kjulius, hvis du sender svar sender jeg point.

Jeg takker
Avatar billede kjulius Novice
30. august 2005 - 18:14 #6
Selv tak...
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
Computerworld tilbyder specialiserede kurser i database-management

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