Sql 通过将一行值分组,将行转换为列

Sql 通过将一行值分组,将行转换为列,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,我的桌子像 CompanyName | DirectorName ADS | Rai ADS | Rao ADS | Raj ADS | Rio SAS | Josh SAS | John 但我想要的结果是: CompanyName | Director1 | Director2 | Director3 | Director4 ADS |Rai |Rao

我的桌子像

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       |           |
每个公司的董事人数各不相同。因此,请建议如何根据需求动态形成数据。

尝试以下方法:

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

1:多亏了@bluefeet

在选择
@cols
时,您不需要完整的查询,您只需从表中选择,并在
quotename()
中使用
'Director'+CAST(ROW_NUMBER()(按c.companyname划分,按c.companyname排序)作为VARCHAR(10)
如果您在sql fiddle for sql server中使用
,则需要将查询终止符更改为
GO
——否则请删除
,以使其正常工作。非常感谢。查询按预期工作。再次感谢