使用带有SQL的pivot将一些列转换为行

时间:2013-07-03 22:06:55

标签: sql pivot sql-server-2012 transpose

MS SQL Server 2012

我有一张名为 indexrows

的表格
name    displayname propertyvalue
abc      $row1        agg
abc      $row2        spx
abc      $row3        qqq
def      $row1        spx
def      $row2        qqq

我想将这些结果转换成这样的结果。

name    $row1   $row2   $row3
abc      agg    spx    qqq
def      spx    qqq 

我尝试了以下查询但没有成功。我收到此错误

第15行,第15行,第1行,第10行 关键字'for'附近的语法不正确。

select * 
from (
select 
name,propertyvalue, displayname
from indexrows
) a
PIVOT 
(
propertyvalue
for [displayname] in ('$row1', '$row2', '$row3')
) as pivot

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

您的查询存在一些问题。

首先,你在PIVOT上缺少一个聚合函数。您需要约propertyvalue的汇总。

其次,你需要用方括号括起$row1等,而不是单引号。

第三,我会为as pivot

使用不同的别名

结果代码将是:

select * 
from 
(
  select name, propertyvalue, displayname
  from indexrows
) a
pivot
(
  max(propertyvalue)
  for [displayname] in ([$row1], [$row2], [$row3])
) piv;

请参阅SQL Fiddle with Demo

答案 1 :(得分:2)

PIVOT需要一个聚合函数,因为原始表中可能有多个条目。如果您知道每个键只有一个值,那么只需使用MIN()。

此外,'$ row1','$ row2','$ row3'现在是列,需要像列一样分隔

select * 
from (
  select 
  name,propertyvalue, displayname
  from indexrows
) a
PIVOT 
(
MIN(propertyvalue)
for [displayname] in ([$row1], [$row2], [$row3])
) as pivot