将列的结果转换为单行

时间:2012-12-06 13:20:48

标签: sql sql-server-2008 tsql pivot

我有下表:

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

1 个答案:

答案 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

请参阅SQL Fiddle with Demo

静态PIVOT版本:您将硬编码名称的值到此查询中

select *
from
(
  select name, rating
  from yourtable
) src
pivot
(
  max(rating)
  for name in ([Engineering], [Financials], [Scope],
               [Schedule], [Risks], [People])
) piv

请参阅SQL Fiddle with Demo

如果您拥有已知数量的列,则上述版本效果很好,但如果您的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)

请参阅SQL Fiddle with Demo

所有三个版本都会产生相同的结果:

| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
|           1 |          3 |     1 |        2 |     3 |      3 |