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
——否则请删除;
,以使其正常工作。非常感谢。查询按预期工作。再次感谢