Avatar billede florint Nybegynder
30. april 2007 - 07:16 Der er 6 kommentarer og
2 løsninger

Sum af poster med samme gns pris

Hejsa,
Jeg har følgende forespørgsel som henter alle poster bestemt af varenummer og dato fra - dato til:
SELECT DPSTATD.VareNr, DPSTATD.AntEnheder, DPSTATD.LinieBeloeb, [LinieBeloeb]/[AntEnheder] AS GnsPris
FROM DPSTATD INNER JOIN DPSTATM ON DPSTATD.BrevNr=DPSTATM.BrevNr
GROUP BY DPSTATD.VareNr, DPSTATD.AntEnheder, DPSTATD.LinieBeloeb, [LinieBeloeb]/[AntEnheder], DPSTATM.FakturaDato
HAVING (((DPSTATD.VareNr)=[Varenummer]) AND ((DPSTATM.FakturaDato)>=[Indtast Start Dato (dd-mm-åå)] And (DPSTATM.FakturaDato)<=[Indtast Slut Dato (dd-mm-åå)]));

MEN hvordan får jeg lagt alle poster med SAMME GnsPris sammen så jeg kan se hvor mange stk jeg har solgt med samme GnsPris??
Den kan jeg ikke lige gennemskue?
På forhånd tak
Mvh
Avatar billede terry Ekspert
30. april 2007 - 20:00 #1
Without any idea of your tables/data. If the current query returns GnsPris then I would suggest that you make a new query which selects from theis query.

Group on GnsPris and make a could in the same field.
Avatar billede kjulius Novice
30. april 2007 - 23:26 #2
Tja, umiddelbart ville jeg jo tro, at du bare skulle lægge gennemsnittet ind i GROUP BY:

SELECT DPSTATD.VareNr, [LinieBeloeb]/[AntEnheder] AS GnsPris, SUM(DPSTATD.AntEnheder) AS Solgt
FROM DPSTATD INNER JOIN DPSTATM ON DPSTATD.BrevNr=DPSTATM.BrevNr
WHERE (((DPSTATD.VareNr)=[Varenummer]) AND ((DPSTATM.FakturaDato)>=[Indtast Start Dato (dd-mm-åå)] And (DPSTATM.FakturaDato)<=[Indtast Slut Dato (dd-mm-åå)]))
GROUP BY DPSTATD.VareNr, [LinieBeloeb]/[AntEnheder];

Så kan du selvfølgelig ikke have de andre oplysninger med (Enhedspris og AntalEnheder); jeg går ud fra, at enhedsprisen ikke er den samme for alle solgte enheder af den samme vare? Hvorfor skulle gennemsnitsprisen ellers være interessant...?

Eller er det salget af varer med samme gennemsnitspris på tværs af varenumre, du ønsker?

Så kunne et forslag være noget i retning af dette:

SELECT DPSTATD.VareNr, DPSTATD.AntEnheder, DPSTATD.LinieBeloeb, X.GnsPris, X.GnsAntEnheder
FROM DPSTATD
INNER JOIN DPSTATM ON DPSTATD.BrevNr=DPSTATM.BrevNr
INNER JOIN (
  SELECT [LinieBeloeb]/[AntEnheder] AS GnsPris, SUM(DPSTATD.AntEnheder) As GnsAntEnheder
  FROM DPSTATD
  INNER JOIN DPSTATM ON DPSTATD.BrevNr=DPSTATM.BrevNr
  GROUP BY [LinieBeloeb]/[AntEnheder]
) AS X ON X.GnsPris = DPSTATD.LinieBeloeb / DPSTATD.AntEnheder

Jeg kan selvfølgelig ikke garantere, at det vil køre som de skøre, men det er da et indspark... :-)
Avatar billede kjulius Novice
30. april 2007 - 23:58 #3
Nå nej, da du jo selekterer på varenummeret, kan det ikke være på tværs af varesortimentet, så udgangspunktet må være den første SQL. Men måske kunne den udbygges lidt - lidt ala den sidste SQL i min tidligere kommentar:

SELECT DPSTATD.VareNr, DPSTATD.AntEnheder, DPSTATD.LinieBeloeb, X.GnsPris, X.SolgteEnheder
FROM DPSTATD
INNER JOIN DPSTATM ON DPSTATD.BrevNr=DPSTATM.BrevNr
INNER JOIN
  (
  SELECT DPSTATD.VareNr, [LinieBeloeb]/[AntEnheder] AS GnsPris, SUM(DPSTATD.AntEnheder) AS SolgteEnheder, MIN(DPSTATM.FakturaDato) AS StartDato, MAX(DPSTATM.FakturaDato) AS SlutDato
  FROM DPSTATD
  INNER JOIN DPSTATM ON DPSTATD.BrevNr=DPSTATM.BrevNr
  WHERE (((DPSTATD.VareNr)=[Varenummer]) AND ((DPSTATM.FakturaDato)>=[Indtast Start Dato (dd-mm-åå)] And (DPSTATM.FakturaDato)<=[Indtast Slut Dato (dd-mm-åå)]))
  GROUP BY DPSTATD.VareNr, [LinieBeloeb]/[AntEnheder]
) AS X ON X.VareNr=DPSTATD.VareNr And DPSTATM.FakturaDato Between StartDato And SlutDato And X.GnsPris = LinieBeloeb / AntEnheder;

Igen: Ingen garanti for, at det her vil køre.
Avatar billede kjulius Novice
01. maj 2007 - 00:14 #4
Ovenstående kan naturligvis også (i Access) laves som to separate forespørgsler, hvor den ene baserer sig på den foregående. For at have samme navnekonvention skulle du i så fald oprette en forespørgsel ved navn X, som indeholder den indre SQL:

SELECT DPSTATD.VareNr, [LinieBeloeb]/[AntEnheder] AS GnsPris, SUM(DPSTATD.AntEnheder) AS SolgteEnheder, MIN(DPSTATM.FakturaDato) AS StartDato, MAX(DPSTATM.FakturaDato) AS SlutDato
FROM DPSTATD
INNER JOIN DPSTATM ON DPSTATD.BrevNr=DPSTATM.BrevNr
WHERE (((DPSTATD.VareNr)=[Varenummer]) AND ((DPSTATM.FakturaDato)>=[Indtast Start Dato (dd-mm-åå)] And (DPSTATM.FakturaDato)<=[Indtast Slut Dato (dd-mm-åå)]))
GROUP BY DPSTATD.VareNr, [LinieBeloeb]/[AntEnheder]

Herefter kunne du lave en ny forespørgsel, som trak på denne:

SELECT DPSTATD.VareNr, DPSTATD.AntEnheder, DPSTATD.LinieBeloeb, X.GnsPris, X.SolgteEnheder
FROM DPSTATD
INNER JOIN DPSTATM ON DPSTATD.BrevNr=DPSTATM.BrevNr
INNER JOIN X ON X.VareNr=DPSTATD.VareNr And DPSTATM.FakturaDato Between StartDato And SlutDato And X.GnsPris = LinieBeloeb / AntEnheder

Resultatet skulle gerne være det samme. Men især hvis man ikke har direkte adgang til databasen (typisk hvis man tilgår data via ODBC eller lign. fra ASP eller PHP web-sider) bruger man metoden fra min tidligere kommentar. Access har dog begrænset understøttelse for metoden (man kan bruge den i ét niveau), og det begrænser naturligt nok mulighederne.
Med flere på hinanden byggende forespørgsler er der ikke de samme begrænsninger, så hvis det er et rent Access projekt du har gang i, var det måske en god ide, at bruge flere forespørgsler... - det er op til dig... :-)
Avatar billede florint Nybegynder
08. maj 2007 - 12:11 #5
Hej kjulius
Tak for forslagene, men jeg fik en syntaxfejl når jeg lavede 00.14.42, men anyway jeg laved 2 forespørgsler som følger:
SELECT DPSTATD.VareNr, DPSTATD.AntEnheder, DPSTATD.LinieBeloeb
FROM DPSTATD INNER JOIN DPSTATM ON DPSTATD.BrevNr = DPSTATM.BrevNr
GROUP BY DPSTATD.VareNr, DPSTATD.AntEnheder, DPSTATD.LinieBeloeb, DPSTATM.FakturaDato
HAVING (((DPSTATD.VareNr)=[Varenummer]) AND ((DPSTATM.FakturaDato)>=[Indtast Start Dato (dd-mm-åå)] And (DPSTATM.FakturaDato)<=[Indtast Slut Dato (dd-mm-åå)]));

Og herefter:
SELECT vare.VareNr, Sum(vare.AntEnheder) AS Antal, Sum(vare.LinieBeloeb) AS Ialt, [LinieBeloeb]/[AntEnheder] AS GnsPris, DPVARE.Bet
FROM vare INNER JOIN DPVARE ON vare.VareNr = DPVARE.VareNr
GROUP BY vare.VareNr, [LinieBeloeb]/[AntEnheder], DPVARE.Bet;

OG fik det ønskede resultat....
Læg et svar så du kan få del i point for indsatsen.
Undskyl ventetiden.
Mvh
Avatar billede kjulius Novice
08. maj 2007 - 19:08 #6
Oki-doki! :-)
Avatar billede terry Ekspert
09. maj 2007 - 08:10 #7
thanks florint.
I hope your happy with the sharing of the points kjulius, if not then let me know.
Avatar billede kjulius Novice
09. maj 2007 - 08:54 #8
Sure, no problems. You're one of the "productive" guys, so even if your contribution to this particular problem wasn't a big one, you've earned the points on so many other occations. Anyhow, even my contributions wasn't used, so I guess we can both count ourselved lucky to even get points. ;-)  Thanks florint!! :-)
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

IT-JOB

Akademikernes A-kasse

AI Product Owner

Capgemini Danmark A/S

Open Application (Denmark)

Erhvervsakademi Aarhus

Undervisere til it-uddannelser

Forsvarsministeriets Materiel- og Indkøbsstyrelse

IT-Sikkerhedsrådgiver til Cyberdivisionen i Hvidovre