2011-08-29 14 views
5

Bir grup insan var. Onlara A, B, C diyoruz. Onların her ay ödendi ne kadar gösteren bir tablo ....Pivot verileri 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 

BU masa ve (

bu tabloyu döndürmek için bir yol var mı .. yıllarca devam edicek olabilir var Gördüğüm kadarıyla hiçbir şey gerçekten pivotlarda yapılan kümelenmeye ihtiyaç duymaz. Aşağıdaki gibi görünen bir tabloda?

 JAN FEB MAR APR MAY JUN JUL AGU SEP 
A 10  20 
B 10  20  -  -  -  -  -  -  30 
C 10  -  -  -  -  20  30  -  40 
önce ama böyle bir şey girmek o herhangi bir fikir ortak bir sorun olduğunu varsayalım mı

?

+0

etmeye devam edebilirsiniz " "MONTH" üzerinde toplanır. Sadece veri kümenizde zaten bir araya getirilmiş. Sadece 'SUM' gibi bir şey kullanın. – Yuck

+0

sabit sütun sayısı için bunu yapabilirsin, Jan..Feb ..., –

+0

sütunların hiçbiri değişken için bunu yapamazsın ... Değişken sütunlar için bunu yapmanın bir yolu yok mu? – JBone

cevap

3

Eğer (veya üstü) SQL Server 2005 kullanıyorsanız, burada kod şudur:

olursa olsun bu kaç farklı durum çalışacak
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 ile bir sorguyu dinamik olarak birleştirir. Dinamik sütunlarla PIVOT yapabileceğiniz tek yol, sorguyu dinamik olarak SQL Server'da yapılabilecek şekilde birleştirmektir.

Diğer örnekler: her zaman bir yıl içinde 12 ay vardır beri, sütunların dinamik # neden ihtiyaç

2

emin değilim. Ay isimleriniz de uzunluk olarak biraz tutarsız görünüyor.

Numune sonuç kümesi: masanıza Karşı

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 

bu olacaktı:

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 

bunu şöyle bir yıl sütunu eklerseniz:

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

Dinamik sütun gerekiyor, çünkü her yıl için tekrar tekrar aylar yazmak istemiyoruz. – JBone

+0

[YEAR] sabit bir sütunsa, yapmanız gereken bir sebep yok. Üçüncü örneğimi gör. – Kenneth