【问题标题】:Convert rows into columns by grouping one row value通过分组一个行值将行转换为列
【发布时间】:2012-11-15 11:32:25
【问题描述】:

我的桌子是这样的

CompanyName | DirectorName
ADS         | Rai
ADS         | Rao
ADS         | Raj
ADS         | Rio
SAS         | Josh
SAS         | John

但我想要这样的结果:

CompanyName | Director1 | Director2 | Director3 | Director4 
ADS         |Rai        |Rao        |Raj        |Rio  
SAS         |Josh       |John       |           |

对于每个公司的董事姓名计数各不相同。所以请建议如何根据要求动态形成数据。

【问题讨论】:

    标签: sql sql-server sql-server-2008 pivot


    【解决方案1】:

    试试这个:

    DECLARE @cols AS NVARCHAR(MAX);
    DECLARE @query AS NVARCHAR(MAX);
    
    SELECT @cols = STUFF((SELECT distinct ',' +  
                         QUOTENAME('Director' + CAST(ROW_NUMBER() 
                                            OVER(PARTITION BY c.companyname 
                                                 ORDER BY c.companyname) 
                                          AS VARCHAR(10)))
                   FROM CompaniesDirectors c
                   FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)')  ,1,1,'');
    
    SET @query = 'SELECT companyname,  ' + @cols + ' from 
                 (
                    SELECT 
                      c.CompanyName, 
                      c.DirectorName,  
                      ''Director'' + CAST(ROW_NUMBER() 
                                          OVER(PARTITION BY c.companyname 
                                          ORDER BY c.companyname) 
                                        AS VARCHAR(10)) director_num
                    FROM CompaniesDirectors c
                 ) x
                 PIVOT 
                 (
                    MAX(directorname)
                    FOR director_num IN (' + @cols + ')
                 ) p ';
    
    EXECUTE(@query);
    

    这应该会给你类似的东西:

    companyname    Director1    Director2    Director3    Director4
        AB            Foo          Bar           rr          tt
        ADS           Rai          Rao           Raj         Rio
    

    SQL Fiddle Demo1

    1:感谢@bluefeet

    【讨论】:

    • 选择@cols时不需要完整查询,您可以从表中选择,在quotename()中使用'Director' + CAST(ROW_NUMBER() OVER(PARTITION BY c.companyname ORDER BY c.companyname) AS VARCHAR(10)
    • 如果你在sql fiddle for sql server中使用;,那么你需要将查询终止符更改为GO--sqlfiddle.com/#!3/4e695/3否则删除;使其工作
    • 非常感谢。查询按我们的预期工作。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2016-01-19
    • 2020-11-14
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多