Avatar billede Nicolai Nybegynder
19. oktober 2012 - 16:45 Der er 8 kommentarer og
1 løsning

SUM af en tabel, men checke anden tabel

Hej,

Jeg er interesseret i et SUM() en given kolonne i TabelA under visse forudsætninger i Tabel A. Men derudover ønsker jeg kun at summere hvis en værdi i TabelA findes i TabelB og denne værdi i TabelB har en specific værdi i en anden kolonne.

TABEL A
54250 | Peter | Hansen | 250
54120 | Søren | Jensen | 570
51400 | Peter | Larsen | 520
57800 | Peter | Petersen | 788

TABEL B
54250 | KundeA
54120 | Leverandør
51400 | KundeA
57800 | Leverandør

Jeg vil gerne summere alle der hedder Peter til fornavn og som er KundeA i TabelB.
Avatar billede Nicolai Nybegynder
19. oktober 2012 - 19:02 #1
Det skal lige siges at begge tabeller er MEGET store (+2.000.000 rækker).
20. oktober 2012 - 00:37 #2
Er det ikke blot simpelhen:

SELECT SUM(tal) FROM TABELA a JOIN TABELB b ON a.id = b.id WHERE a.fornavn = 'Peter' AND b.type = 'KundeA'

Jeg gaar her ud fra, at felterne i TABELA hedder id, fornavn, efternavn, og tal, og at felterne i TABELB hedder id og type.

(Fra dit eksempel kunne det se ud som om der er en en-til-en relation mellem TABELA og TABELB, saaledes at der til hver raekke i TABELA hoerer en og kun en raekke i TABELB.  Hvis det er tilfaeldet behoever du vel ikke to tabeller.  Du kunne 'merge' tabellerne.  Det burde give bedre 'performance'.)
Avatar billede Nicolai Nybegynder
22. oktober 2012 - 16:02 #3
Den løser desværre ikke helt mit problem. Jeg har prøvet at lave følgende SQL Query, men den giver ikke de rigtige resultater:

SELECT Year, Period, SUM(Revenue) AS Total
FROM dbo.tblXSAP_Revenue a
JOIN dbo.tblXSAP_AccountOwner b
ON a.SalesDoc = b.ContractNr
WHERE b.LOB_CONTRACT = 'LEO'
GROUP BY Year, Period
ORDER BY Year, Period

Det jeg ønsker at at få summen af kolonnen revenue i tblXSAP_Revenue for alle de linjer hvor kontraktnummeret (SalesDoc/ContractNr) i tblXSAP_AccountOwner har værdien "LEO" i kolonnen "LOB_CONTRACT".

Kan I gennemskue hvad jeg gør forkert?
Avatar billede Syska Mester
22. oktober 2012 - 16:07 #4
Først ... hvad betyder forkert her? Kan du vise os lidt test data uden du laver group by ... så kan vi nok nemmere gennemskue hvad der går galt.

Dvs ... data du får ud uden group by ... og forventet data.
22. oktober 2012 - 16:58 #5
Syntaksen i din sql query ser umiddelbart rigtig nok ud, og din forventning synes rimelig, at du for hvert year og period skal få summen af revenue for LEO.  Hvad får du i stedet for?  Får du nogen fejlmeldinger?
Avatar billede Nicolai Nybegynder
22. oktober 2012 - 17:26 #6
Jeg får ingen fejlmeldinger, men summen er for høj!. HVis jeg f.eks. kigger på 2012 periode 008 (august) med følgende query:

SELECT * FROM [BASS].[dbo].[tblXSAP_Revenue] WHERE PeriodB = '008.2012' AND RIGHT(BT, 5) = 'P3287'

så får jeg 345 rows output. Summen af det output stemmer overens med mine forventinger for den samlede sum. Men prøver jeg derefter at kører:

SELECT * FROM dbo.tblXSAP_Revenue a JOIN dbo.tblXSAP_AccountOwner b ON a.SalesDoc = b.ContractNr WHERE Right(a.BT,5) IN ('P3287') AND a.PeriodB = '008.2012' AND b.LOB_SEGMENT = 'LEO' ORDER BY Year, Period

så får jeg 1.161 linjer. Det må jo betyde at den tæller samme række med fra dbo.tblXSAP_Revenue flere gange? Det skal siges at samme kontraktnummer sagtens kan optræde flere gange i dbo.tblXSAP_AccountOwner med at værdien for "LOB_SEGMENT" altid vil være den samme... Det er sikkert her problemet ligger?
22. oktober 2012 - 18:18 #7
Det har du nok ret i (at samme række fra tblXSAP_Revenue tælles med flere gange.)

Hvad med (ikke testet) at omforme selecten i #3  til sådan noget som:

SELECT Year, Period, SUM(Revenue) AS Total
FROM dbo.tblXSAP_Revenue
WHERE SalesDoc IN
(SELECT ContractNr FROM dbo.tblXSAP_AccountOwner WHERE LOB_CONTRACT = 'LEO')

Altså: i stedet for at joine tabellerne, således at rækkerne i _Revenue gentages lige så mange gange som der er relevant kontraktnumre i _AccountOwner bruger du en subselect for at få fat i SalesDoc/contract numre for LEO.
Avatar billede Nicolai Nybegynder
22. oktober 2012 - 22:58 #8
Det virkede! Jeg kunne ikke se skoven for bar træer! Tak - smider du et svar?
23. oktober 2012 - 04:30 #9
Svar fra mig.
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