Avatar billede Nicolai Nybegynder
24. maj 2013 - 09:01 Der er 7 kommentarer og
1 løsning

SQL String - Multiple Sum på første resultat

Hej,

Jeg her lidt problemer med en ellers overskuelig SQL streng.

SELECT SalesDoc, Sum(RevenueCleaned) AS CreditNotes
  FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized]
  WHERE CCOA_Acc = '32050102' AND RevenueCleaned < 0
  GROUP BY SalesDoc

Jeg er interesseret i at finde alle SalesDoc var RevenueCLeaned er mindre end 0 og de tilhøre CCOA_Acc '32050102'. Det gør ovenstående streng perfekt.

Nu er jeg interesseret i også at finde al positiv omsætning (det vil sige RevenueCleaned > 0) på de SalesDoc som er opfyldt af den ovenstående string.

Mit resultat skal dermed ende som:

SalesDoc    Negativ_Total    Positiv_Total

På forhånd tak...
Avatar billede Slettet bruger
24. maj 2013 - 10:33 #1
Måske sådan:

SELECT SalesDoc
,Sum(cse when RevenueCleaned < 0 then RevenueCleaned else 0 end) AS Negativ_total
,Sum(cse when RevenueCleaned > 0 then RevenueCleaned else 0 end) AS
Positiv_total
FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized]
WHERE CCOA_Acc = '32050102'
GROUP BY SalesDoc
Avatar billede Slettet bruger
24. maj 2013 - 10:34 #2
en lille tryk-fejl:

SELECT SalesDoc
,Sum(case when RevenueCleaned < 0 then RevenueCleaned else 0 end) AS Negativ_total
,Sum(case when RevenueCleaned > 0 then RevenueCleaned else 0 end) AS
Positiv_total
FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized]
WHERE CCOA_Acc = '32050102'
GROUP BY SalesDoc
Avatar billede Nicolai Nybegynder
24. maj 2013 - 12:03 #3
Din løsning er god nok, men den giver mig et for højt Positiv_Total, idet den også tager SalesDoc som ikke har en Negativ_total.

Lad mig give et eksempel på data:

SalesDoc RevenueCleaned
123      -1.500
123      +1.000
321      +2.400
321      +510
456      -50
456      +10

Det resultat jeg gerne vil have ud af ovenstående er:

SalesDoc  Negativ_Total  Positiv_Total
123        -1.500          +1.000
456        -50            +10

Bemærk at 321 ikke er med, da den ikke indeholder en negativ post, men udelukkende positive.
Avatar billede Nicolai Nybegynder
24. maj 2013 - 12:05 #4
Der kan selvfølgelig være adskillige records per salesdoc, og jeg skal bruge summen (se nedenstående udviddede datasæt)

SalesDoc RevenueCleaned
123      -1.500
123      +1.000
123      -250
123      -50
321      +2.400
321      +510
456      -50
456      +10

Output ønsket:
SalesDoc  Negativ_Total  Positiv_Total
123        -1.800          +1.000
456        -50            +10
24. maj 2013 - 18:29 #5
Du vil have data for de salesdoc hvor der både er positive og negative RevenueCleaned værdier.  Du er ikke interesseret i data fra de salesdoc's hvor der kun er positive eller nul RevenueCleaned værdier og heller ikke interesseret i data fra de salesdoc's hvor der kun er negative eller nul værdier. 

Ikke testet, men det lyder som en WHERE clausul i retning af denne:

WHERE salesdoc IN (SELECT salesdoc FROM  [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE RevenueCleaned < 0) AND salesdoc IN(SELECT salesdoc FROM  [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE RevenueCleaned > 0

Dataerne selv ville jeg nok (stadig ikke testet) trække ud med subqueries, såsom:

SELECT a.SalesDoc,
(SELECT SUM(RevenueCleaned) FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE  CCOA_Acc = '32050102' AND RevenueCleaned < 0) AS Negativ_total,
(SELECT SUM(RevenueCleaned) FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE  CCOA_Acc = '32050102' AND RevenueCleaned > 0) AS Positiv_total
FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized] AS a
WHERE salesdoc IN (SELECT salesdoc FROM  [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE RevenueCleaned < 0) AND salesdoc IN(SELECT salesdoc FROM  [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE RevenueCleaned > 0
24. maj 2013 - 18:31 #6
Sludder og vrøvl.  Her er en, forhåbenligt, forbedret version:

SELECT a.SalesDoc,
(SELECT SUM(RevenueCleaned) FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE  CCOA_Acc = '32050102' AND RevenueCleaned < 0 AND SalesDoc = a.SalesDoc) AS Negativ_total,
(SELECT SUM(RevenueCleaned) FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE  CCOA_Acc = '32050102' AND RevenueCleaned > 0 AND SalesDoc = a.SalesDoc) AS Positiv_total
FROM [BASS].[dbo].[tblXSAP_Revenue_Optimized] AS a
WHERE salesdoc IN (SELECT salesdoc FROM  [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE RevenueCleaned < 0) AND salesdoc IN(SELECT salesdoc FROM  [BASS].[dbo].[tblXSAP_Revenue_Optimized] WHERE RevenueCleaned > 0
Avatar billede Nicolai Nybegynder
27. maj 2013 - 07:39 #7
Christian_Belgien: tak for et super godt svar. Jeg er faktisk også interesseret i dem der kun er negative, så jeg har ændret lidt på dit svar. Mit fint input hjalp mig helt klart i mål - så ligger du lige et svar?

Mvh Nicolai
27. maj 2013 - 08:28 #8
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

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