我有下表:
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查询。有人可以帮助我获得正确的输出吗?
答案 0 :(得分:3)
您正在尝试PIVOT
数据。 SQL Server有一个PIVOT
函数可以为您执行此操作。要执行PIVOT
,您需要确定要使用的聚合函数。在我的示例中,我使用了MAX()
,但您可以使用SUM()
等。
如果您没有透视功能,那么您可以使用带有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
静态PIVOT版本:您将硬编码名称的值到此查询中
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
如果您拥有已知数量的列,则上述版本效果很好,但如果您的name
值未知,则可以使用动态sql来PIVOT
数据。
动态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 |