简体   繁体   中英

Transpose some columns to rows using pivot with SQL

MS SQL Server 2012

I have a table called indexrows

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

I would like to transpose these results to look like this.

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

I tried the following query without success. I get this error

Msg 156, Level 15, State 1, Line 10 Incorrect syntax near the keyword 'for'.

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

Any help is appreciated.

There are a few things are wrong with your query.

First, you are missing an aggregate function on your PIVOT. You need an aggregate around propertyvalue .

Second, you need to surround the $row1 , etc with square brackets not single quotes.

Third, I would use a different alias for the as pivot

As a result the code will be:

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

See SQL Fiddle with Demo

PIVOTs need an aggregate function, because you could have multiple entries in the original table. If you know you only have one value per key, then just use MIN().

Also, '$row1', '$row2', '$row3' are now columns and need to be delimited like columns

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM