2017-08-22 14 views
-1

次のクエリを再帰的に実行する方法があるかと思いますが、最新の6ヶ月間に6回繰り返します。私は現在の月の前に数ヶ月ごとにデータを5つの以上の行を返すしたい次のクエリの6つの個別月間の再帰的なSQLクエリ

enter image description here

を次のようにこのクエリの

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()) 

結果があります。それは可能なことですか?私はできれば5つの個別のクエリを実行しないようにしたいと思います。

あらかじめご協力いただきありがとうございます。

+0

再帰CTEを使用することができます? – arcee123

答えて

3

あなたがGROUP BYと現在の月から戻って6ヶ月を移動するDATEADD()を使用してこれを行うことができます。

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

あなたはWHERE句を削除するときに何が起こるか

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

私は必要ありません。 Topicstarterは再帰呼び出しを使用したい。 – ventik

+0

私はそれに責任がある、私は再帰が必要になると思っていた、それは私が求めていたものです。 – David