Erwartetes Ergebnis
%Vor%Explantion
Die Baseline-Tabelle hat einen einzelnen Baseline-Wert für jeden CCP.
Der Baseline-Wert sollte auf das erste Quartal jedes CCP angewendet werden und für die nächsten Quartale wird der vorherige Quartals-Summenwert der Basleine sein.
Hier ist eine funktionierende Abfrage in Sql Server 2008
UPDATE:
Um mit mehr als einem Jahr zu arbeiten
%Vor% Jetzt suche ich nach einer Lösung in Sql Server 2012+
, die SUM OVER(ORDER BY)
Funktionalität oder einen besseren Weg nutzt
Versuchte so etwas
%Vor%Aber nicht Training
Eine andere Methode, die die Funktionen EXP(SUM(LOG()))
trick und only window für die laufende Summe verwendet (keine rekursiven CTEs oder Cursor).
Getestet unter dbfiddle.uk :
%Vor%So funktioniert es:
( CREATE
tables und INSERT
übersprungen)
1 , lässt sich nach ccp, year und quart gruppieren und die Summen berechnen:
%Vor% %Vor%
EXP(LOG(SUM())
Trick, um die laufenden Multiplikationen dieser Summen zu berechnen. Wir verwenden BETWEEEN .. AND -1 PRECEDING
im Fenster, um die aktuellen Werte zu überspringen, da diese Werte nur für die Basislinien des nächsten Quarts verwendet werden. LOG()
und EXP()
ergeben. Sie können mit ROUND()
oder mit NUMERIC
:
%Vor% %Vor%
gts
verbinden, so dass wir jeden Wert multiplizieren können mit der berechneten q2
(was uns die Basis gibt). CROSS APPLY
dient lediglich dazu, die Basisbasislinie für jedes ccp zu erhalten. numeric(22,6)
ändere, anstatt auf 2 Dezimalstellen zu runden. Die Ergebnisse sind die gleichen wie beim Beispiel, aber sie können sich unterscheiden, wenn die Zahlen größer oder nicht ganzzahlig sind:
%Vor% %Vor%
Ich bin nicht sicher, ob die Frage ist, wie die over()
Logik oder führen Sie eine rekursive Cte in 2012 oder berechnen Sie einfach in 2012 ohne rekursive Cte.
Sieht so aus, als hätten Sie versucht, das PRODUCT()
aggregation-Äquivalent zu erstellen. Aber wie ich meinen Kommentar einfüge
Die Funktion 'Exp' ist keine gültige Fensterfunktion und kann nicht mit der OVER-Klausel verwendet werden.
Also habe ich meine Version ohne rekursive cte für meine Antwort gemacht. Ich füge ein zusätzliches Jahr zu den Beispieldaten mit unterschiedlichen Grundlinien hinzu
gts
für jeden Quart
Quart
Quart
, der den Dummy PRODUCT()
aggregiert Ausgabe
%Vor%Eine weitere Alternative ist die Verwendung von gestapelten / kaskadierten CTEs:
%Vor%Ohne CTE. Ich würde empfehlen, mit den Monaten und Jahren in einem aktuellen Datumsformat zu arbeiten. Ich könnte ein bisschen einfacher werden, den Übergang der Jahre 2015 vs 2016 zu einem einfachen DATEADD (MM, -1, dateCol) zu verwalten, im Gegensatz zu herauszufinden, wann ein Jahr subtrahieren oder hinzufügen. Ich habe diese Lösung nicht implementiert, könnte aber helfen, wenn Sie sie benötigen. Es könnte zu einer ziemlich effektiven Indexierungsstrategie führen, um die Abfrage zu beschleunigen, wenn Sie einen großen Datensatz haben. Ich glaube, es wäre auch möglich, dies mit LAG zu implementieren.
%Vor%Tags und Links sql sql-server tsql sql-server-2012 sql-server-2014