Avatar billede lanthernen Nybegynder
18. september 2008 - 13:10 Der er 8 kommentarer og
1 løsning

Forespørgsel på tabeller

Hejsa

Har et udtræk der kører der som sådan virker ok.

Dataene overføres fra en anden DB hver 15 minutter.

Dataene indeholder salgsdata fra en kasse hvor der sælges artikler på.

Når dataene overføres er de summeret op, det vil sige er der solgt 3 armvinger står der 3 i c.stueck osv.

Hvis jeg ved næste overførsel har solgt 2 armvinger mere får jeg en ny record hvor der i c.stueck selvfølgelig står 2.

Kan jeg på en eller anden måde ikke summere op så jeg bare har en record hvor der står 5 i c.stueck?

Mit problem umiddelbart (tror jeg) har at gøre med vkdate som er en dato og klokkeslet der indsættes for hvornår overførslen skete. Jeg kan sagtens undvære denne dato, men så har jeg problemer med HAVING hvor jeg har day(vkdate) osv som sørger for at udtrækket laves på dags dato...

Kan jeg på en eller anden måde summere op?

Udtrækket kører kun en gang om dagen


select DISTINCT b.preisn as PrisNr, c.vkdate as Dato, a.artbez as Type, a.artkbz as Beskrivelse, SUM(c.stueck) as Antal, b.vpreis as Pris, SUM(c.storno) as Annullering, ((c.stueck)-(c.storno)) as TotalAntal, (((c.stueck)-(c.storno))*(b.vpreis)) as TotalPris
FROM aart a, vprz b, skab c
GROUP BY a.aartnr, a.artbez, a.artkbz, b.preisn, b.vpreis, c.stueck, c.storno, c.aartnr, c.preisn, c.vkdate
HAVING a.aartnr = c.aartnr and b.preisn = c.preisn and day(vkdate)=day(getDate()) and month(vkdate)=month(getDate()) and year(vkdate)=year(getDate())
ORDER BY a.artbez
Avatar billede Syska Mester
18. september 2008 - 13:54 #1
Du siger at det kun køres en gang per dag, men i starten siger du at det overføres hvert 15 min. Det er så bare til en anden table ?

Hvad det du vil opnå i denne anden table ?

Jeg er en smule forvirret over hvad et præcist er du mangler? Da du egentlig skriver at det hele virker ....

Med mindre problemet er følgende:
Du henter data fra en anden table som indeholder hvor meget der er solgt de sidste 15 mins. Det vil du have over i en anden table. Du vil kun have en record per dag, dvs findes den record ikke for den type vare skal den oprettes eller skal antallet af varer solgt de sidste 15 mins tilføjes.

// ouT
Avatar billede lanthernen Nybegynder
18. september 2008 - 14:52 #2
Mit udtræk kører kun en gang om dagen.

Dataene jeg bruger kommer fra en anden DB og overføres til min DB hver 15 min.
Dette kan jeg ikke ændre på
Avatar billede lanthernen Nybegynder
18. september 2008 - 14:53 #3
Bare glem den anden DB
Avatar billede lanthernen Nybegynder
18. september 2008 - 14:53 #4
SOm jeg skriver

Når dataene overføres er de summeret op, det vil sige er der solgt 3 armvinger står der 3 i c.stueck osv.

Hvis jeg ved næste overførsel har solgt 2 armvinger mere får jeg en ny record hvor der i c.stueck selvfølgelig står 2.

Kan jeg på en eller anden måde ikke summere op så jeg bare har en record hvor der står 5 i c.stueck?

Mit problem umiddelbart (tror jeg) har at gøre med vkdate som er en dato og klokkeslet der indsættes for hvornår overførslen skete. Jeg kan sagtens undvære denne dato, men så har jeg problemer med HAVING hvor jeg har day(vkdate) osv som sørger for at udtrækket laves på dags dato...

Kan jeg på en eller anden måde summere op?
Avatar billede lanthernen Nybegynder
18. september 2008 - 14:55 #5
Det vil sige istedet for a have 2 records der indeholder:
c.stueck =3
og
c.stueck =2
vil jeg kun have en record i mit udtræk hvor:
c.stueck=5
Avatar billede gnoname Praktikant
18. september 2008 - 15:17 #6
Fejlen ligger i at du har c.vkdate med i din group by klausul. (desuden har jeg tilføjet SUM til dine udregninger af totaler - er det ikke mere rigtigt?):

select
DISTINCT b.preisn as PrisNr,
        max(c.vkdate) as Dato,
        a.artbez as Type,
        a.artkbz as Beskrivelse,
        SUM(c.stueck) as Antal,
        b.vpreis as Pris,
        SUM(c.storno) as Annullering,
        (SUM(c.stueck)-SUM(c.storno)) as TotalAntal,
        (SUM(c.stueck)-SUM(c.storno))*(b.vpreis)) as TotalPris
FROM    aart a,
        vprz b,
        skab c
GROUP BY a.aartnr, a.artbez, a.artkbz, b.preisn, b.vpreis, c.stueck, c.storno, c.aartnr, c.preisn
HAVING a.aartnr = c.aartnr and b.preisn = c.preisn and day(vkdate)=day(getDate()) and month(vkdate)=month(getDate()) and year(vkdate)=year(getDate())
ORDER BY a.artbez
Avatar billede lanthernen Nybegynder
23. september 2008 - 21:12 #7
-> gnoname

Får denne fejl:
Server: Msg 8121, Level 16, State 1, Line 1
Column 'c.vkdate' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
Server: Msg 8121, Level 16, State 1, Line 1
Column 'c.vkdate' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
Server: Msg 8121, Level 16, State 1, Line 1
Column 'c.vkdate' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
Avatar billede gnoname Praktikant
24. september 2008 - 16:10 #8
Korrekt vkdate skal også lige flyttes fra HAVING klausulen:

select
DISTINCT b.preisn as PrisNr,
        max(c.vkdate) as Dato,
        a.artbez as Type,
        a.artkbz as Beskrivelse,
        SUM(c.stueck) as Antal,
        b.vpreis as Pris,
        SUM(c.storno) as Annullering,
        (SUM(c.stueck)-SUM(c.storno)) as TotalAntal,
        (SUM(c.stueck)-SUM(c.storno))*(b.vpreis)) as TotalPris
FROM    aart a,
        vprz b,
        skab c
WHERE  day(c.vkdate)=day(getDate())
AND    month(c.vkdate)=month(getDate())
AND    year(c.vkdate)=year(getDate())
GROUP BY a.aartnr, a.artbez, a.artkbz, b.preisn, b.vpreis, c.stueck, c.storno, c.aartnr, c.preisn
HAVING a.aartnr = c.aartnr
AND    b.preisn = c.preisn
ORDER BY a.artbez
Avatar billede lanthernen Nybegynder
24. september 2008 - 21:43 #9
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