Laufende Summe

IchHH

Datenbank-Guru
Beiträge
284
Einen schönen guten Abend alle zusammen,

ich stelle ein Frage die mehrfach bereits gestellt wurde aber nicht zu meinem Fall passt. Wie bilde ich eine laufende Summe über Kalenderwochen (KW)?

Klingt trivial ist es für mich aber offensichtlich nicht. Ich verwende folgende Code um Werte pro KW zu erzeugen.

SELECT
'IST' AS [IST/BUD]
,'Liquidität EUR TP Ende Periode' AS [Beschreibung]
,'27' AS [Sortierung Kontenname]
,SUM(CASE WHEN [Sortierung Kontenname]= 5 THEN '0'
WHEN [Sortierung Kontenname]= 6 THEN '0'
ELSE [Wert in Buchungskreiswährung]
END) AS [Wert in Buchungskreiswährung]
,[FISCYEARPER] --2022001, 2022002, 2022003 usw.
,[dbo].[v_LQ_ACDOCA_Liqui_2].[TheISOYear] -- 2022, 2021, 2020
,[KW] -- KW 01, KW 02, KW 03 usw.
,[Überschrift]
,[Sortierung KW]
--,[dbo].[v_LQ_ACDOCA_Liqui_2].TheDate --20221101
FROM
[dbo].[v_LQ_ACDOCA_Liqui_2]

WHERE RIGHT([FISCYEARPER],2) <= '12'

GROUP BY
--TheDate
[FISCYEARPER]
,[dbo].[v_LQ_ACDOCA_Liqui_2].[TheISOYear]
,[KW]
,[Überschrift]
,[Sortierung KW]

Werte die in den entsprechenden Spalten vorkommen können habe ich mal hinter den Spalten als Kommentar hinterlegt. Normalerweise gibt es meines Erachtens nun 3 Wege um ein einen Wert pro KW zu erhalten der alle Werte des aktuellen und der Vormonate enthält.

1. Inner Join auf sich selber
2. Sum(xxx) Over (Order by xxx) und
3. Sum(xxx) Over (Partition by xxx)

Ich bekomme aber wirklich keinen einzigen mit den von mir gewünschten Ergebnis zusammen. Wie wird es richtig gemacht, wenn alle Information benötigt werden und ich das ganze in einer View verarbeiten möchte?

Wäre über eure Hilfe sehr dankbar.
 
Werbung:
Deine Abfrage bringt einem jetzt nicht soviel an Infos.
Was bekommst Du derzeit (Klartext)?
Was soll raus kommen (Klartext)?

Der Ansatz ist eigentlich simpel:
- Gruppierung / Summierun der Zahlen pro KW (in diesem Fall)
- Sum(<wert>) over (partition by <kw column> order by <kw column>)
nicht alles über XXX

Inner Join auf sich selbst hängt vielleicht mit Deinen Daten zusammen, hat aber nichts mit running totals zu tun.
Ansonsten empfehl ich vom Vorgehen mal, die Sache etwas abzuspecken. Nicht 20 Spalten mitverarbeiten, sondern nur die 2, auf die es ankommt, KW und WERT. Es sollte mit einem normalen Group By Statement eine Summe pro KW abzufragen sein. Das dann aufblasen auf laufende Summe erweitern. Und das kann man dann mit weiteren Spalten aufbauen, wenn es funktioniert.
 
Hallo dabadepdu,

das war ebenfalls ein Ansatz. Ich habe versucht erst einmal nur mit 3 Spalten zu arbeiten.

- [Wert in Buchungskreiswährung]
- [FISCYEARPER]
- KW
das Ergebnis ist wie zu erwarten, richtig.

[Wert in Buchungskreiswährung] FISCYEARPER KW
10 2022003 9
5 2022003 10
7 2022003 11
6 2022003 12
5 2022003 13

Nun würde ich erwarten wollen, dass wenn ich die
KW 13 ermitteln möchte die Werte (10+5+7+6+5)= 33 angezeigt bekomme, bei
KW 12 (10+5+7+6) = 28 usw.

Sum(<wert>) over (partition by <kw column> order by <kw column>) habe ich versucht bekomme aber keine anderen Werte raus wie vor der Summierung. Was meines Erachtens nach auch verständlich ist wenn ich Partitioniere mit FISCYEARPER und KW. Nach nur KW kann ich nicht Partitionieren, was im übrigen auch für die FISCYEARPER gilt, da ich dann die Jahre nicht berücksichtigen würde die in der FISCYEARPER enthalten sind.
 
Werbung:
Ich noch mal. Ich habe hier ein Lösungsansatz versucht, den ich gerne teil würde, weil er kein anderes Ergebnis ausgibt und ich nicht verstehe warum.SELECT
SUM(LI.[Wert in Buchungskreiswährung]) AS [Wert in Buchungskreiswährung]
,DD.KeyID
FROM
(
SELECT SUM(CASE WHEN [Sortierung Kontenname]= 5 THEN '0'
WHEN [Sortierung Kontenname]= 6 THEN '0'
ELSE [Wert in Buchungskreiswährung]
END) AS [Wert in Buchungskreiswährung]
,CONCAT(left([FISCYEARPER],4),right([KW],2)) as KeyID
FROM
[dbo].[v_LQ_ACDOCA_Liqui_2]

WHERE RIGHT([FISCYEARPER],2) <= '12'

GROUP BY
[FISCYEARPER]
,[KW]
) LI

INNER JOIN
(
SELECT DISTINCT
CONCAT(TheYear,FORMAT(TheISOweek,'00')) AS KeyID
,TheYear
,TheISOweek
,TheISOMonth
FROM [Toolport].[dbo].[DateDimension]) DD

ON DD.KeyID = LI.KeyID

WHERE DD.KeyID >= LI.KeyID

GROUP BY DD.KeyID

Der herauskommende Wert ist identisch mit dem Ergebnis aus der LI obwohl ich nun eine Summe aller vorangegangen Werte erwartet hätte.
 
Zurück
Oben