您正在尝试PIVOT
数据。SQL Server 有一个PIVOT
功能可以为您执行此操作。要执行,PIVOT
您需要决定使用什么聚合函数。在我的示例中,我使用了,MAX()
但您可以使用SUM()
等。
如果您没有数据透视函数,则可以使用带有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
请参阅带有演示的 SQL Fiddle
如果您有已知数量的列,上述版本工作得很好,但如果您的name
值未知,那么您可以PIVOT
对数据使用动态 sql。
动态 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)
请参阅带有演示的 SQL Fiddle
所有三个版本都将产生相同的结果:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |