2016-04-21 6 views
1

Ich versuche die Anzahl der Monate zu ermitteln, die basierend auf der ID vergangen sind. Es ist möglich, dass bei einigen Datensätzen die Monate nicht jedes Mal um 1 erhöht werden Record für 1/1/13 und 3/1/13 aber nicht 2/1/13) aber ich möchte nur eine Anzahl der Datensätze in meiner Tabelle. So fehlende Monate sind nicht wichtig.SQL - Anzahl der Monate, die von einem Personenindikator verstrichen sind

Eine Beispieltabelle wäre: (notieren Sie den fehlenden Monat und es ist Irrelevanz).

DATE  ID Months Passed 
----------- --- -------------- 
2013-11-01 105 1 
2013-12-01 105 2 
2014-02-01 105 3 
2014-03-01 105 4 

im Prinzip eine Excel COUNTIFS in SQL, die ich geschrieben habe:

=COUNTIFS(IDColumn, ID, MonthColumn, "<=" & Month) 

jemand eine Möglichkeit, Kennt die gewünschte Spalte mit SQL zu generieren?

+0

Wie wäre es ROW_NUMBER? https://msdn.microsoft.com/en-us/library/ms186734.aspx –

Antwort

2

Versuchen Sie ROW_NUMBER(). Wenn Sie möchten, dass die Spalte "Monate bestanden" jeweils um 1 und für jede ID erhöht wird, ist das der Fall.

SELECT 
Date, 
Id, 
Indicator, 
ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Date) AS RowNum 
FROM YourTable 
WHERE Indicator = 'YES' 

UNION 

SELECT 
Date, 
Id, 
Indicator, 
0 AS RowNum 
FROM YourTable 
WHERE Indicator = 'NO' 
+0

Ausgezeichnet! Das hat super funktioniert. Um meine Frage zu beantworten, gibt es eine zusätzliche Spalte, die ich einfach weggelassen habe, weil ich dachte, wenn diese Frage beantwortet würde, wäre die andere einfach zu lösen, aber ich sehe, dass das nicht der Fall ist. Die fragliche Spalte ist ein "Ja/Nein" -Anzeige, und das Ende-Spiel für diese Abfrage soll ihre wachsenden Rekord zeigen. Wie würde ich die YES-Werte basierend auf ID und Monat auch in wachsender Anzahl zählen? Das hinzugefügte "Ich möchte nur YES-Werte zählen" scheint den ROW_NUMBER() -Befehl in den Griff zu bekommen. Wie auch immer, es hat großartig für die Monate funktioniert. – snellington

+0

Gute Frage ... Sie haben recht, dass das Hinzufügen einer weiteren Spalte einen Haken in Sachen verursacht. Es ist ein bisschen ein Hack, aber Sie können UNION zwei Abfragen. Einer wird zählen, mit der obigen Abfrage WHERE Yes/No = "YES". Dann UNION WHERE Ja/Nein = "NEIN" und einfach 0 als deine Zeilennummer verwenden ... Lass es mich wissen, wenn das nicht für dich funktioniert. – BenM

+0

Aktualisierte ursprüngliche Antwort mit Abfrageänderungen. – BenM

0

Sie könnten mehr einfach die Reihen von Monat gruppiert zählen (komplexer, wenn Sie Zahl Monate in verschiedenen Jahren haben separat):

SELECT COUNT(derived.monthVal) 
FROM (SELECT MONTH(<your date field>) AS monthVal 
     FROM [your table] 
     WHERE [Your ID Column] = <the id> 
     GROUP BY MONTH(<your date field>)) AS derived; 
Verwandte Themen