2011-08-29 41 views
5

Tôi có một nhóm người. Cho phép gọi chúng là A, B, C. Tôi có một bảng hiển thị họ được trả bao nhiêu mỗi tháng ....Dữ liệu trục trong 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 

bảng NÀY thể và không tiếp tục trong nhiều năm và năm ..

Có cách nào để xoay bảng này (không có gì như tôi thấy thực sự cần phải được tổng hợp mà thường được thực hiện trong pivots) Trong một bảng trông giống như sau?

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

Bạn chưa từng gặp phải vấn đề như thế này trước đây nhưng cho rằng đó là vấn đề thường gặp trong mọi ý tưởng?

+0

Bạn vẫn có thể " tổng hợp "vào' MONTH'. Nó chỉ là trong tập dữ liệu của bạn nó đã được tổng hợp. Chỉ cần sử dụng một cái gì đó như 'SUM'. – Yuck

+0

bạn có thể làm điều này cho số cột cố định, Jan..Feb ..., bạn không thể làm điều này cho biến số cột –

+0

... Không có cách nào để làm điều này cho các cột biến? – JBone

Trả lời

3

Nếu bạn đang sử dụng SQL Server 2005 (hoặc cao hơn), đây là mã:

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) 

này sẽ làm việc dù có bao nhiêu trạng thái khác nhau mà bạn có. Nó tự động lắp ráp một truy vấn với PIVOT. Cách duy nhất bạn có thể làm PIVOT với các cột động là bằng cách lắp ráp truy vấn động, có thể được thực hiện trong SQL Server.

ví dụ khác:

2

Tôi không chắc chắn lý do tại sao bạn cần một động # cột, vì lúc nào cũng có 12 tháng trong một năm. Ngoài ra tên tháng của bạn có vẻ hơi không phù hợp chút nào.

Mẫu kết quả thiết lập:

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 

Against bảng này sẽ trở thành:

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 

Nếu bạn thêm một cột năm nó trông như thế này:

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

Cần cột động vì chúng tôi không muốn viết các tháng trong mỗi năm lặp đi lặp lại – JBone

+0

Không có lý do gì bạn phải làm nếu [YEAR] là cột cố định. Xem ví dụ thứ ba của tôi. – Kenneth

Các vấn đề liên quan