19. oktober 2012 - 16:45Der 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
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'.)
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".
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?
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?
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.
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.