Pivot data in T-SQL

前端 未结 2 1363
萌比男神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:01

    If you are using SQL Server 2005 (or above), here is the code:

    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 )
    

    This will work no matter how many different status you have. It dynamically assembles a query with PIVOT. The only way you can do PIVOT with dynamic columns is by assembling the the query dynamically, which can be done in SQL Server.

    Other examples:

    • SQL Server PIVOT perhaps?
    • How do I build a summary by joining to a single table with SQL Server?
    0 讨论(0)
  • 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
    
    0 讨论(0)
提交回复
热议问题