2017-12-28 28 views
1

私はSQLクエリを持ち、PIVOTテーブルを作成しています。日付付き動的SQLクエリ

ここにあります。

SELECT * 
FROM (
    SELECT 
    Name 
    ,Year 
    ,sum(Payment) as TotalPayment 
    FROM Orders 
    group by Name,Date 
) as Tablo 
PIVOT 
(
    SUM(TotalPayment) 
    FOR Date IN ([2009-11],[2009-12],[2010-01]) 
) 
AS p 

このクエリを作成した月ごとの合計支払い額と月ごとに手動で年月を追加したユーザーを取得しています。私はそれを動的に行う必要があります。

ループなどのSQLクエリを使用して月から年を動的に取得するにはどうすればよいですか?

ありがとうございました!

+0

使用 'ダイナミックSQL' – Squirrel

+0

使用' DATEADD(MONTH、-2、GETDATE()) ' – waka

+0

@Squirrelかの線に沿って何か:考える: –

答えて

2

relativeの時刻を使用し、absoluteではないことをお伝えします。このようにして、クエリは常に最新の状態になります。私は、CTEを使用してステップバイクエリ段階書き込み

create table t (d date, i int); 
insert into t values 
('2016-01-01', 100), 
-- ... some other data 
('2017-12-13', 100); 

:ここで私はSQL Fiddle

MS SQL Serverの2014スキーマのセットアップ上のサンプルを投稿ここで

with 
cooked as   --change to relative months (from today) 
(select datediff(MONTH,getdate(), d) as dif, i 
    from t 
), 
filtered as  --just take the last 12 months 
(select dif as Date, i as TotalPayment 
    from cooked 
    where dif > -12 
) 
select *   --pivoting 
from filtered 
PIVOT 
(
    SUM(TotalPayment) 
    FOR Date IN ([-11],[-10],[-9],[-8], 
       [-7],[-6],[-5],[-4], 
       [-3],[-2],[-1],[0]) 
) 
AS p 

Resultsを、ここで[0]はこの蛾を意味し、[-11]は12ヶ月前を意味します:

| -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 
|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----| 
| 500 | 500 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |