2

微软 SQL 服务器 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 

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

消息 156,级别 15,状态 1,第 10 行关键字“for”附近的语法不正确。

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

任何帮助表示赞赏。

4

2 回答 2

5

您的查询有一些问题。

首先,您缺少 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

于 2013-07-03T22:12:08.447 回答
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
于 2013-07-03T22:13:40.003 回答