我有下表:
Name Rating Engineering 1 Financials 3 Scope 1 Schedule 2 Risks 3 People 3
我希望输出如下:
Engineering Financials Scope Schedule Risks People 1 3 1 2 3 3
仅使用SQL查询。有人可以帮助我获得正确的输出吗?
您正在尝试PIVOT数据。SQL Server具有PIVOT可以为您执行此操作的功能。要执行,PIVOT您需要确定要使用的聚合函数。在我的示例中,我使用过,MAX()但是您可以使用SUM(),等等。
PIVOT
MAX()
SUM()
如果没有枢轴函数,则可以将聚合函数与CASE语句一起使用来执行此操作。
CASE
聚合/ CASE版本: 此版本要求您将所有名称硬编码到列中。
select max(case when name = 'Engineering' then rating end) Engineering, max(case when name = 'Financials' then rating end) Financials, max(case when name = 'Scope' then rating end) Scope, max(case when name = 'Schedule' then rating end) Schedule, max(case when name = 'Risks' then rating end) Risks, max(case when name = 'People' then rating end) People from yourtable
参见带有演示的SQL Fiddle
静态PIVOT版本: 您会将名称的值硬编码到此查询中
select * from ( select name, rating from yourtable ) src pivot ( max(rating) for name in ([Engineering], [Financials], [Scope], [Schedule], [Risks], [People]) ) piv
如果您具有已知的列数,则上述版本非常name有用,但是如果您的值未知,则可以PIVOT对数据使用动态sql 。
name
动态PIVOT版本:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT ' + @cols + ' from ( select name, rating from yourtable ) x pivot ( max(rating) for name in (' + @cols + ') ) p ' execute(@query)
所有这三个版本将产生相同的结果:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE | ---------------------------------------------------------------- | 1 | 3 | 1 | 2 | 3 | 3 |