Change Columns Name dynamically in sql

前端 未结 3 955
面向向阳花
面向向阳花 2021-01-26 12:16

I have a query result like this :

Date       User1 User2 User3 ....
----------------------------------
1/1/2000   55     78    98   ...
1/1/2001   26     33    5         


        
3条回答
  •  孤街浪徒
    2021-01-26 13:00

    SQL Fiddle

    Schema Setup:

    create table history (date datetime, name varchar(10), value int);
    insert history values
     ('20130101', 'user1', 123),
     ('20130101', 'user2', 124),
     ('20130101', 'user3', 125),
     ('20130102', 'user1', 223),
     ('20130102', 'user3', 223),
     ('20130103', 'user2', 323);
    
    create table colours (name varchar(10), colour_name varchar(10));
    insert colours values
     ('user1', 'blue'),
     ('user2', 'green'),
     ('user3', 'brown');
    

    Query:

    DECLARE @scols nvarchar(max),
            @cols AS NVARCHAR(MAX),
            @query AS NVARCHAR(MAX);
    
    select @cols = STUFF((
      SELECT ',' + QUOTENAME(C.Name)  
      from (select distinct name from [History]) C
      ORDER BY C.Name
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
    
    select @scols = STUFF((
      SELECT ',' + QUOTENAME(Name) + ' AS ' + QUOTENAME(colour_Name)  
      from (select distinct c.name, x.colour_name
            from [History] C
            JOIN colours x on x.name = c.name) y
      ORDER BY Name
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
    
    set @query = '
        SELECT [Date],' + @scols +' 
        from (
            select [Date], Name, Value
            from [History]
             ) x
        pivot 
             (
            max(value)
            for Name in (' + @cols + ')
             ) p ';
    
    -- print @query --<< uncomment this line to see the query that gets generated
    exec (@query);
    

    Results:

    |                           DATE |   BLUE |  GREEN |  BROWN |
    -------------------------------------------------------------
    | January, 01 2013 00:00:00+0000 |    123 |    124 |    125 |
    | January, 02 2013 00:00:00+0000 |    223 | (null) |    223 |
    | January, 03 2013 00:00:00+0000 | (null) |    323 | (null) |
    

提交回复
热议问题