2016-06-14 3 views
0

指定された日付から12ヶ月間のサマリーレポートを表示する次のSQLクエリがあります。 1月から12月にかけて、指定された日付の出力が表示されます。
結果は、指定された日付の月から開始します。指定された月から始まるSQL Yearのサマリー

指定された日付は、私は、出力がこの

May 16 |June 16| July 16| ........... | Jan 17 | Feb 17 | March 17 | April 17 | 

どのように私はこれを達成することができますようになりたい'2016-05-01'ある場合は?
いくつか提案できますか?

SELECT Name,SUM(Amount) AS PremiumTot,TotType, 
sum(case when month(Dates) = 1 then Tot else 0 end) Jan, 
sum(case when month(Dates) = 2 then Tot else 0 end) Feb, 
sum(case when month(Dates) = 3 then Tot else 0 end) March, 
sum(case when month(Dates) = 4 then Tot else 0 end) April, 
sum(case when month(Dates) = 5 then Tot else 0 end) May, 
sum(case when month(Dates) = 6 then Tot else 0 end) June, 
sum(case when month(Dates) = 7 then Tot else 0 end) July, 
sum(case when month(Dates) = 8 then Tot else 0 end) Aug, 
sum(case when month(Dates) = 9 then Tot else 0 end) Sep, 
sum(case when month(Dates) = 10 then Tot else 0 end) Oct, 
sum(case when month(Dates) = 11 then Tot else 0 end) Nov, 
sum(case when month(Dates) = 12 then Tot else 0 end) Dece 

FROM 
(
    SELECT InvoiceMasterID,Dates ,Name,CompanyCommission AS Tot ,0 AS Expences,Amount,1 as TotType 
    FROM CommissionView 

    UNION ALL 

SELECT InvoiceMasterID,Dates,Name, 0 AS Tot ,-AgentCommission AS Expences,Amount,2 as TotType 
    FROM CommissionViewCredit 
) a 
    WHERE Dates between @fromDates AND Datesadd(yy,1,@fromDates) 
    GROUP BY Name,TotType 
+0

オンザフライで列を並べ替えるには、動的SQLに頼り、SQL文を作成して実行する必要があります。また、PIVOTを調べることをお勧めします。なぜなら、最後の列を並べ替えるだけで済むからです。 – Matt

答えて

3

と思われます。データをピボットします。したがって、PIVOTテーブルを使用してください!

指定した日付から動的列を作成する場合は、CTE(共通表の式)を使用してください。詳細については

--declare variables for given date range 
DECLARE @startDate DATE = '2016-05-01' 
DECLARE @endDate DATE = DATEADD(mm,11,@startDate) 
--declare variable to store months as: [month1], [month2], [etc.] 
DECLARE @Months VARCHAR(1000) = '' 
--use cte to create range of dates 
;WITH MyDates AS 
(
    SELECT @startDate AS MyDate 
    UNION ALL 
    SELECT DATEADD(mm,1,MyDate) AS MyDate 
    FROM MyDates 
    WHERE MyDate<@endDate 
) 
SELECT @Months = STUFF((SELECT '],[' + CONVERT(VARCHAR(7), MyDate, 121) 
         FROM MyDates 
         FOR XML PATH('')), 1, 2, '') + ']' 

--PRINT @Months: 
-- prints: [2016-05],[2016-06], ... ,[2017-04] 

DECLARE @qry NVARCHAR(MAX) = '' 

SET @qry = N'SELECT ' + @Months + 
' FROM (' + 
    ' SELECT CONVERT(VARCHAR(7), Dates, 121) AS MyDate, CompanyCommission AS Tot ' + 
    'FROM CommissionView ' + 
') AS DT ' + 
'PIVOT (SUM(Tot) FOR MyDate IN(' + @Months + ')) AS PT' 
EXEC (@qry) 

、参照してください。
Dynamic PIVOT
Pivots with dynamic columns
CAST and CONVERT

幸運!

+0

私は 'SELECT @ Months ='クエリーを注文することで、正確なカラムの順序を日付 – JamieD77

+0

@ JamieD77で確実に取得することをお勧めします。作成の順番は正しい順序でなければなりません。 –

+0

@MaciejLos - 本当にありがとうございます –

関連する問題