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

+2

你的问题不明确。其实,这不是一个问题。 – woz

+1

你有什么尝试?这是一个问题和答案网站,而不是*我的代码为我的网站*。 – Matt

+0

@woz:什么是回滚? – Matt

回答

3

您正在尝试PIVOT的数据。 SQL服务器有一个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版本:

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 | 
+0

非常感谢...我得到了答案。 – Puskar

+0

多数民众赞成在多数民众赞成在...再次 – Puskar

+0

@普斯卡尔如果任何答案对你有帮助,一定要接受通过左边的复选标记。 – Taryn