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
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