Som gebruik van aliassen

Status
Niet open voor verdere reacties.

barendrecht82

Gebruiker
Lid geworden
24 mrt 2013
Berichten
230
Hoi,

Ik heb een SQL statement uit het ERPsysteem gehaald. Alleen wil ik een de "Credit" -/- "Debit" uitrekenen direct samen met de query. De berekenig van de Credit en debit is erg lang. Hoe kan ik dit makkelijker berekenen?

Dus ik heb 1 kolom nodig die dan de som (credit -/-debit) is tussen deze twee kolommen

Code:
SELECT        TOP (100) PERCENT dbo.grtbk.reknr, dbo.grtbk.oms25_0 AS GlOms, ISNULL(dbo.gbkmut.artcode, '--') AS artcode, dbo.Items.Description_0 AS ItOms, SUM(CASE WHEN transtype IN ('N', 'C', 'P', 'F') 
                         THEN CASE WHEN TransSubType NOT IN ('R', 'S') THEN CASE WHEN bdr_hfl >= 0 THEN (bdr_hfl) ELSE 0 END ELSE CASE WHEN bdr_hfl < 0 THEN (bdr_hfl) ELSE 0 END END ELSE 0 END) AS Debit, 
                         SUM(CASE WHEN transtype IN ('N', 'C', 'P', 'F') THEN CASE WHEN TransSubType NOT IN ('R', 'S') THEN CASE WHEN bdr_hfl >= 0 THEN 0 ELSE - (bdr_hfl) 
                         END ELSE CASE WHEN bdr_hfl < 0 THEN 0 ELSE - (bdr_hfl) END END ELSE 0 END) AS Credit, SUM(CASE WHEN transtype IN ('N', 'C', 'P', 'F') THEN gbkmut.aantal ELSE 0 END) AS Aantal
FROM            dbo.gbkmut INNER JOIN
                         dbo.grtbk ON dbo.gbkmut.reknr = dbo.grtbk.reknr LEFT OUTER JOIN
                         dbo.Items ON dbo.gbkmut.artcode = dbo.Items.ItemCode
WHERE        (dbo.gbkmut.transtype IN ('N', 'C', 'P', 'F')) AND (dbo.gbkmut.ReminderCount <= 12) AND (dbo.grtbk.reknr BETWEEN ' 70023500' AND ' 70901100') AND (dbo.gbkmut.transsubtype <> 'X')
GROUP BY dbo.grtbk.reknr, dbo.grtbk.oms25_0, ISNULL(dbo.gbkmut.artcode, '--'), dbo.Items.Description_0
ORDER BY dbo.grtbk.reknr, GlOms, artcode, ItOms


Het gaat dus om deze twee :

Code:
SUM(CASE WHEN transtype IN ('N', 'C', 'P', 'F') 
                         THEN CASE WHEN TransSubType NOT IN ('R', 'S') THEN CASE WHEN bdr_hfl >= 0 THEN (bdr_hfl) ELSE 0 END ELSE CASE WHEN bdr_hfl < 0 THEN (bdr_hfl) ELSE 0 END END ELSE 0 END) AS Debit, 
                         SUM(CASE WHEN transtype IN ('N', 'C', 'P', 'F') THEN CASE WHEN TransSubType NOT IN ('R', 'S') THEN CASE WHEN bdr_hfl >= 0 THEN 0 ELSE - (bdr_hfl) 
                         END ELSE CASE WHEN bdr_hfl < 0 THEN 0 ELSE - (bdr_hfl) END END ELSE 0 END) AS Credit,
 
Sinds wanneer kent Access een Case statement? Een Top (100) lijkt mij overigens een zinloze toevoeging. Een query laat standaard al alles zien.
 
@AccessGuru: Dat is dus een standaard T-SQL expressie (zie mijn cursus die ik naar dit forum heb doorgestuurd) en komt waarschijnlijk uit een reporting systeem. In een reporting query kan je geen sort order meegeven zonder top expressie. En ja, dat heeft wel duidelijk zin.

@barendrecht: Ik zal het statement eens bekijken.
 
Als ik het statement bekijk kan dat eventueel vereenvoudigd worden door de eerste CASE weg te laten. In de WHERE clause staat immers dat het transactie type zowiezo 'N', 'C', 'P' of 'F' moet zijn:
Code:
WHERE        (dbo.gbkmut.transtype IN ('N', 'C', 'P', 'F')) AND (dbo.gbkmut.ReminderCount <= 12)
Dus de case dat het een andere transactie is kan niet voorkomen in deze dataset.
Dan hou je voor het debet over:
Code:
, SUM(CASE WHEN TransSubType NOT IN ('R', 'S') THEN 
				CASE WHEN bdr_hfl >= 0 THEN (bdr_hfl) ELSE 0 END 
			ELSE 
				CASE WHEN bdr_hfl < 0 THEN (bdr_hfl) ELSE 0 END 
			END ) AS Debit,
en voor de credit krijg je een gelijkaardige expressie
het antal wordt eenvoudig:

Code:
 SUM(gbkmut.aantal) as Aantal
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan