2016-07-22 7 views
-2

Wie kann ich die aktuelle Zeilenanzahl der Tabelle bis zum aktuellen Monat auswählen und die Zählwerte der letzten 6 Monate gruppieren?Anzahl nach Datum auswählen

Probendaten:

Id  CreatedTime  PersonId  MonthValue 
1  2015-03-01  1    100 
2  2015-03-15  5    200 
3  2015-04-19  7    400 
... 
... 
... 
980 2016-07-22  1349   100 

wünschen zu Gruppenzeile in Ausgangszählwert wie:

Date  Total 
07/2016 331 
06/2016 277 
05/2016 145 
04/2016 100  
03/2016 69 
02/2016 57 
+3

können Sie zeigen das Schema der Tabelle, die Sie mit einigen Beispieldaten abfragen bitte? – Tanner

+0

@Tanner Sorry für fehlende Informationen, ich habe es jetzt hinzugefügt, aber ich habe die richtige Antwort von Vercelli. – Drazen

Antwort

1

Verwenden einer Hilfstabelle mit Daten:

;with dateaux as (select eomonth(GETDATE()) as d, -1 as lev union all 
       select eomonth(dateadd(month,lev,getdate())), lev-1 from dateaux where lev >-6) 
select format(d, 'MM/yyyy'), count(*) 
from dateaux join table1 t on dateaux.d >= t.mydate 
group by format(d, 'MM/yyyy') 

dateaux Ausgang würde wie folgt aussehen :

d   lev 
2016-07-31 -1 
2016-06-30 -2 
2016-05-31 -3 
2016-04-30 -4 
2016-03-31 -5 
2016-02-29 -6 
0

Sie können so etwas wie folgt verwenden:

SELECT LEFT(CONVERT(nvarchar(10),[DateField],112),6) as [Date], 
     COUNT(*) as [Total] 
FROM YourTable 
WHERE DATEDIFF(month,[DateField],GETDATE()) < 6 
GROUP BY LEFT(CONVERT(nvarchar(10),[DateField],112),6) 
ORDER BY LEFT(CONVERT(nvarchar(10),[DateField],112),6) DESC 

Auf meiner Dummy-Daten mit 12 Monate erhalte ich:

Date Total 
201607 207 
201606 270 
201605 279 
201604 270 
201603 279 
201602 261 

Wenn Sie kumulativen Daten benötigen:

;WITH cte AS (
SELECT LEFT(CONVERT(nvarchar(10),[DateField],112),6) as [Date], 
     COUNT(*) as [Total] 
FROM YourTable 
WHERE DATEDIFF(month,[DateField],GETDATE()) < 6 
GROUP BY LEFT(CONVERT(nvarchar(10),[DateField],112),6) 
) 

SELECT c1.[Date], 
     SUM(c2.[Total]) as [Total] 
FROM cte c1 
INNER JOIN cte c2 
    ON c1.[Date] >= c2.[Date] 
GROUP BY c1.[Date], c1.[Total] 
ORDER BY c1.[Date] DESC 

Ausgang:

Date Total 
201607 1566 
201606 1359 
201605 1089 
201604 810 
201603 540 
201602 261 
+0

Diese Abfrage wird Betrag pro Monat geben, aber nicht die kumulative – vercelli

+1

@vercelli vielleicht in der Frage, dass Sie eine kumulative Zählung wollen, sonst wie sollen wir wissen? – Tanner

+0

@vercelli Entschuldigung, dachte, du wärst OP, dieser Punkt richtet sich an OP, wenn es das ist, wonach er sucht. – Tanner

0

Ich nehme an, dass die Daten, die Sie angezeigt haben, die gewünschte Ausgabe sind und dass Sie eine Tabelle mit Daten und Werten haben. Hier ist ein Beispiel dafür, wie Sie etwas ähnliches zu Ihrem gewünschten Ausgang erreichen können:

CREATE TABLE #Sales 
    (
     OrderDate DATETIME , 
     SaleValue DECIMAL(5, 2) 
    ) 

INSERT INTO #Sales (OrderDate , SaleValue) 
    SELECT '20160701' , 125.00 
    UNION ALL 
    SELECT '20160702' , 255.00 
    UNION ALL 
    SELECT '20160621' , 75.00 
    UNION ALL 
    SELECT '20160522' , 95.00 
    UNION ALL 
    SELECT '20160404' , 410.00 
    UNION ALL 
    SELECT '20160412' , 207.00 
    UNION ALL 
    SELECT '20160415' , 107.00 
    UNION ALL 
    SELECT '20160313' , 10.00 
    UNION ALL 
    SELECT '20160207' , 179.00 
    UNION ALL 
    SELECT '20160125' , 237.00 

SELECT YEAR(OrderDate) OrderYear , 
     MONTH(OrderDate) OrderMonth , 
     CAST(MONTH(OrderDate) AS VARCHAR(2)) + '/' 
     + CAST(YEAR(OrderDate) AS VARCHAR(4)) OrderDate , 
     COUNT(SaleValue) Total 
FROM #Sales 
WHERE YEAR(OrderDate) = YEAR(GETDATE()) 
     AND MONTH(OrderDate) >= MONTH(DATEADD(mm, -5, GETDATE())) 
GROUP BY YEAR(OrderDate) , 
     MONTH(OrderDate) 

DROP TABLE #Sales 

Produziert:

OrderYear OrderMonth OrderDate Total 
2016  2   2/2016  1 
2016  3   3/2016  1 
2016  4   4/2016  3 
2016  5   5/2016  1 
2016  6   6/2016  1 
2016  7   7/2016  2