Sum oplossing

Status
Niet open voor verdere reacties.

barendrecht82

Gebruiker
Lid geworden
24 mrt 2013
Berichten
230
Hoi,

Hoe kan ik bij deze statement de som per Generalledger zien en dan alles tot en met 31-12-2022?

Code:
SELECT        TOP (100) PERCENT GeneralLedger, Expr1 AS Datum, Debit, Credit
FROM            dbo.View_GB_boekingen
GROUP BY GeneralLedger, Expr1, Debit, Credit
HAVING        (Expr1 < CONVERT(DATETIME, '2022-12-31 00:00:00', 102))
ORDER BY GeneralLedger


Nu krijg ik alles GL rekeningen onderelkaar zonder dat ze opgeteld zijn..
 
Ten eerste: als je wilt sommeren op een bepaald veld, dan moet je groeperen op zo min mogelijk velden; hoe meer velden, hoe meer het resultaat gaat lijken op een normale selectiequery. Dus ja, dan krijg je alle resultaten niet opgeteld. Ten tweede: Top (100) doet natuurlijk ook niets: dan zie je echt wel alle records. Ik heb jouw db niet, dus ik heb een eigen voorbeeldje gemaakt. Daaruit kun je vast je eigen syntax maken.
Code:
SELECT Year([Datumveld]) AS Datum, Sum(Gas) AS SomVanGas
FROM Meterstanden
WHERE Datumveld<#7/15/2009#
GROUP BY Year([Datumveld])
 
In een view heeft een order by geen zin zonder top(x) expressie. Het is immers niet de bedoeling dat je gaat sorteren in een view, dat doe je in de query die je op de view baseert. Dit om te vermijden dat de engine dubbel werk gaat doen: bv. in de view sorteren op datum en dan in de query op naam gaan sorteren. Als je toch een order by gebruikt in een view, dan zet de engine er automatisch top(100) PERCENT bij.

Wat je vraag betreft: als je zowel de individuele gegevens als de totalen wil gebruiken moet je een windowing functie gebruiken.
bv.

Code:
select generalledger, expr1 as Datum, Debit, Credit, sum(debit) over () as TotaalDebit, sum(credit) over() as TotaalCredit
Where Expr1 < CONVERT(DATETIME, '2022-12-31 00:00:00', 102)

Dan krijg je op elke lijn ook de totalen te zien.
Wil je alleen de totalen zien, dan kan:
Code:
SELECT         GeneralLedger, max(Expr1) AS LastDatum, min(Expr1) AS FirstDatum, sum(Debit), sum(Credit)
FROM            dbo.View_GB_boekingen
GROUP BY GeneralLedger
Where        (Expr1 < CONVERT(DATETIME, '2022-12-31 00:00:00', 102))
ORDER BY GeneralLedger

de having kan je gebruiken als je eerst de groeperingen wil maken met alle gegevens en dan bv. alleen die records nemen waarvan de begindatum van de groep kleiner is dan je expressie, dan kan je de WHERE vervangen door

Having min(Expr1) < CONVERT(DATETIME, '2022-12-31 00:00:00', 102)

Zeker nooit een expressie als
WHERE Datumveld<#7/15/2009#
gebruiken, want SQL server erkent dit formaat niet als een datum. Dat is alleen in Access, en daar is een ander forum voor.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan