Pivot data in T-SQL

前端 未结 2 1376
萌比男神i
萌比男神i 2020-11-28 15:20

I have a group of people. Lets call them A,B,C. I have a table that shows how much they were paid each month....

PERSON|MONTH|PAID
A      JAN   10
A      FEB         


        
2条回答
  •  青春惊慌失措
    2020-11-28 16:07

    I am not sure why you need a dynamic # of columns, since there are always 12 months in a year. Also your month names seem a bit inconsistent in length.

    Sample result set:

    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 your table this would become:

    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
    

    If you add a year column it looks like this:

    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
    

提交回复
热议问题