-3

我有下表:

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

4

1 回答 1

3

您正在尝试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 |
于 2012-12-06T13:35:52.120 回答