2016-05-31 4 views
0

Ich habe einige Probleme mit einer Pivot-Abfrage (SQL Server). Die Aufgabe ist ganz einfach: für eine Person, die ich es sammeln müssen, um das Einkommen Statistiken für jeden Monat in einem Jahr, aber jedes neue Monat Einkommen auf dem previuos income basiert plus der current month incomeSQL-Pivot-Abfrage mit komplexer Aggregation

Nur zum Beispiel. Lassen Sie eine Person ein 3k Gehalt pro Monat (der Einfachheit halber ist es eine Konstante), dann sollte ein Abfrageergebnis so etwas wie dieses:

Year | Jan | Feb | ... | Dec 
2016 | 3k | 6k | ... | 36k 
2015 | 3k | 6k | ... | 36k 
... 

Eine Pseudo SQL-Abfrage ist:

select * from (
    select 
     year(date) as year, 
     month(date) as month 
     salary, 
    from income 
    where personId = 'some id' 
) as tmp 
pivot (
    sum(salary), 
    for month in ([1], [1..2], [1..3], ...) 
) as pvt 

Das Problem ist, es gibt Nein [1..2] Ausdruck in SQL. Wie kann eine solche Abfrage mit einem Standard-SQL durchgeführt werden?

+1

einig Direkt an der Spitze von meinem Kopf Hinweis: innere Abfrage zu partitionieren und die Summe mit einem geeigneten Fenster (? Zwischen den Zeilen unbegrenzt vorhergehende und aktuelle) mit einem Label für Ihre Periode 1to2, 1to3, 1to4 usw Dann drehen Sie auf Ihren Etiketten. Wenn ich heute Abend Zeit habe, schaue ich mir eine vollständige Lösung an. –

Antwort

1

Vielleicht so etwas? (Diese OVER wird für die Version 2008 R2 arbeiten und nach)

create table #income (
    personid int, 
    salary int, 
    [date] date 
) 

insert into #income 
(personid,salary,[date]) 
values 
(1,3000,'2016-01-31'), 
(1,3000,'2016-02-29'), 
(1,3000,'2016-03-31'), 
(1,3000,'2016-04-30'), 
(1,3000,'2016-05-31'); 

select * from (
    select 
     year(date) as year, 
     month(date) as month, 
     SUM(salary) OVER (PARTITION BY personid ORDER BY [date]) salary 
    from income 
    where personId = 1 
) as tmp 
pivot (
    sum(salary) 
    for month in ([1], [2], [3],[4],[5]) 
) as pvt; 

drop table #income; 
+0

Wenn es ein Jahr zuvor Werte gibt, beeinflusst es Ergebnisse des nächsten Jahres. – shadeglare

+1

Ich denke, PARTITION VON personid, Jahr (Datum) ORDER BY [Datum] sollte Ihre Anforderung erfüllen. –

+0

danke. funktioniert wie erwartet. – shadeglare