2017-08-22 4 views
-1

Ich frage mich, ob es eine Möglichkeit gibt, die folgende Abfrage rekursiv durchzuführen, so dass es 6 mal für die letzten 6 Monate tut.Rekursive SQL-Abfrage für 6 einzelne Monate der folgenden Abfrage

SELECT DATENAME(MONTH,GETDATE()) AS 'Month', 
     SUM(CASE WHEN OverallRiskRating = 1 THEN 1 END) AS 'Low', 
     SUM(CASE WHEN OverallRiskRating = 2 THEN 1 END) AS 'Med', 
     SUM(CASE WHEN OverallRiskRating = 3 THEN 1 END) AS 'High' 
FROM dbo.ChangeEvaluationForm 
WHERE MONTH(DateSubmitted) = MONTH(GETDATE()) 

Die Ergebnisse für diese Abfrage sind als

enter image description here

folgt würde ich 5 mehr zurückkommen Zeilen mit Daten für jeden der Monate vor dem aktuellen Monat. Ist das möglich? Ich möchte vermeiden, 5 weitere individuelle Abfragen durchzuführen, wenn ich kann.

Vielen Dank für Ihre Hilfe im Voraus.

+0

was passiert, wenn Sie die Klausel, wo entfernen ? – arcee123

Antwort

3

Sie können dies mit einem GROUP BY und DATEADD() mit zurück 6 Monate ab dem aktuellen Monat verschieben:

Select DateName(Month, DateSubmitted) As 'Month', 
     Sum(Case When OverallRiskRating = 1 Then 1 End) As 'Low', 
     Sum(Case When OverallRiskRating = 2 Then 1 End) As 'Med', 
     Sum(Case When OverallRiskRating = 3 Then 1 End) As 'High' 
From  dbo.ChangeEvaluationForm 
Where DateSubmitted >= DateAdd(Month, DateDiff(Month, 0, DateAdd(Month, -6, GetDate())), 0) 
Group By DateName(Month, DateSubmitted) 
-1

Sie rekursive CTE können

declare @Date smalldatetime 
set @Date = '20170801' 

;with cte as 
(
    select @Date as StartMonth 

    union all 

    select DATEADD(MONTH, -1, StartMonth) 
    from cte 
    where StartMonth > DATEADD(MONTH, -5, @Date) 
) 
SELECT DATENAME(MONTH, D) AS 'Month', 
     SUM(CASE WHEN OverallRiskRating = 1 THEN 1 END) AS 'Low', 
     SUM(CASE WHEN OverallRiskRating = 2 THEN 1 END) AS 'Med', 
     SUM(CASE WHEN OverallRiskRating = 3 THEN 1 END) AS 'High' 
FROM dbo.ChangeEvaluationForm 
    inner join cte on MONTH(DateSubmitted) = MONTH(StartMonth) 
+0

Ich brauche nicht. Der Themenstarter möchte einen rekursiven Aufruf verwenden. – ventik

+0

Ich werde die Schuld dafür nehmen, ich dachte Rekursion würde notwendig sein und das ist, was ich gefragt habe. – David