小编典典

将列的结果转换为单行

sql

我有下表:

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查询。有人可以帮助我获得正确的输出吗?


阅读 144

收藏
2021-05-16

共1个答案

小编典典

您正在尝试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

参见带有演示的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 |
2021-05-16