Zählen Sie datasätze, die mehrere datesbereich überspannen

ACCOUNT Amount DATE 1 50 01-2010 1 100 03-2010 1 100 02-2011 2 100 01-2011 2 50 05-2011 2 50 09-2011 3 100 03-2012 3 100 03-2013 

Gibt es eine Abfrage-Struktur, die es mir erlauben wird, verschiedene Konten zu zählen, die sich im laufenden und im vergangenen Jahr überschritten haben? Zum Beispiel hat Konto 1 Beträge in 2011 und 2010, so dass es einmal unter 2011 gezählt werden sollte. Konto 2 hat nur Beträge im Jahr 2011, so dass es nicht gezählt wird, während Konto 3 in 2013 und 2012 Beträge hat, also wird es als 1 gezählt unter 2013:

  2010 2011 2012 2013 0 1 0 1 

Zuerst müssen Sie die Jahre kennen, in denen Sie data für ein Konto haben:

 select account, year(date) as yr from t group by account, year(date) 

Als nächstes musst du sehen, ob zwei Jahre in der Reihenfolge sind. Sie können dies im Jahr 2012 mit Lag / Blei tun. Stattdessen verwenden wir einfach einen Selbstbeteiligten:

 with ay as ( select account, year(date) as yr from t group by account, year(date) ) select ay.account, ay.yr from ay join ay ayprev on ay.account = ayprev.account and ay.yr = ayprev.yr + 1 

Als nächstes, wenn Sie die Anzahl der Konten nach Jahr zählen wollen, legen Sie dies in eine Aggregation:

 with ay as ( select account, year(date) as yr from t group by account, year(date) ) select yr, count(*) as numaccounts from (select ay.account, ay.yr from ay join ay ayprev on ay.account = ayprev.account and ay.yr = ayprev.yr + 1 ) ayy group by yr 

Angenommen, Sie haben eine datasatz-ID (nennen Sie diese ID)

 SELECT COUNT(*),Year FROM Table t3 INNER JOIN ( SELECT record_id, Year(t1.Date) as Year FROM Table t1 INNER JOIN Table t2 WHERE Year(t1.Date)-1=Year(t2.Date) AND t1.Account == t2.Account ) x ON x.record_id = t3.record_id GROUP BY Year 

Verwenden Sie Unterabfrage:

 SELECT YEAR(T1.Date) AS D, COUNT(*) AS C FROM YourTable AS T1 INNER JOIN YourTable T2 ON T2.Account = T1.Account AND YEAR(T2)=YEAR(T1)+1 GROUP BY T1.Account, YEAR(T1.Date)