2011-08-29 4 views
5

私は人のグループを持っています。それらをA、B、Cと呼ぶことができます。私は、彼らが毎月支払われたどのくらいを示してテーブル....T-SQLのピボットデータ

PERSON|MONTH|PAID 
A  JAN 10 
A  FEB 20 
B  JAN 10 
B  FEB 20 
B  SEP 30 
C  JAN 10 
C  JUNE 20 
C  JULY 30 
C  SEP 40 

このテーブルと(

は、このテーブルをピボットする方法はあります...何年も何年も上に行くんすることができますがあります実際にピボットで行われる集約が必要なものは何もありません)次のような表では、

 JAN FEB MAR APR MAY JUN JUL AGU SEP 
A 10  20 
B 10  20  -  -  -  -  -  -  30 
C 10  -  -  -  -  20  30  -  40 

これまでにこのようなことに踏み出したことはありませんが、これは一般的な問題ですか?

+0

をすることはできまだ " MONTHに集計します。データセット内にすでに集約されているだけです。 'SUM'のようなものを使ってください。 – Yuck

+0

これは固定列数のJan..Feb ...に対して行うことができます。列の変数番号に対してこれを行うことはできません。 –

+0

...これは可変列に対してはできませんか? – JBone

答えて

3

あなたはSQL Server 2005の(またはそれ以上)を使用している場合は、ここでのコードは次のとおりです。

DECLARE @cols VARCHAR(1000) 
DECLARE @sqlquery VARCHAR(2000) 

SELECT @cols = STUFF((SELECT distinct ',' + QuoteName([Month]) 
         FROM YourTable FOR XML PATH('')), 1, 1, '') 


SET @sqlquery = 'SELECT * FROM 
     (SELECT Person, Month, Paid 
     FROM YourTable) base 
     PIVOT (Sum(Paid) FOR [Person] 
     IN (' + @cols + ')) AS finalpivot' 

EXECUTE (@sqlquery) 

これはあなたが持っているどのように多くの異なるステータスに関係なく動作します。 PIVOTを使用してクエリを動的に組み立てます。ダイナミック列を使用してPIVOTを実行する唯一の方法は、SQL Serverでクエリを動的に組み立てることです。

その他の例:

2

12ヶ月は年に常にあるので、私は、あなたが列を動的に#を必要とする理由を確認していません。また、あなたの月の名前は少し矛盾しているようです。

サンプルの結果セット:あなたのテーブルに対する

SELECT * FROM (SELECT 'A' [PERSON],'JAN' [MONTH],'10' [PAID] 
UNION SELECT 'A','FEB',20 
UNION SELECT 'B','JAN',10 
UNION SELECT 'B','FEB',20 
UNION SELECT 'B','SEP',30 
UNION SELECT 'C','JAN',10 
UNION SELECT 'C','JUNE',20 
UNION SELECT 'C','JULY',30 
UNION SELECT 'C','SEP',40) AS A 
PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p 

が、これはなる:

SELECT [PERSON],[MONTH],[PAID] 
FROM [YOURTABLE] 
PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p 

あなたはそれがこのようになります今年の列を追加した場合:

SELECT * FROM (SELECT 'A' [PERSON],'JAN' [MONTH],'10' [PAID], 2011 [YEAR] 
UNION SELECT 'A','FEB',20, 2011 
UNION SELECT 'B','JAN',10, 2011 
UNION SELECT 'A','FEB',20, 2010 
UNION SELECT 'B','JAN',10, 2010 
UNION SELECT 'B','FEB',20,2011 
UNION SELECT 'B','SEP',30,2011 
UNION SELECT 'C','JAN',10,2011 
UNION SELECT 'C','JUNE',20,2011 
UNION SELECT 'C','JULY',30,2011 
UNION SELECT 'C','SEP',40,2011) AS A 
PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p 
+0

毎年何カ月も何度も何度も書きたいとは考えていないので、動的列が必要です – JBone

+0

[年]が固定列である必要はありません。私の3番目の例を見てください。 – Kenneth