2011-08-29 98 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

列的變量no ...沒有辦法做到這一點變量列? – 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

如果[YEAR]是固定列,沒有理由。看我的第三個例子。 – Kenneth