Транспонировать некоторые столбцы в строки, используя сводку с SQL

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 

Я попытался следующий запрос без успеха. Я получаю эту ошибку

Сообщение 156, уровень 15, состояние 1, строка 10 Неправильный синтаксис рядом с ключевым словом "для".

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

Любая помощь приветствуется.

2 ответа

Решение

Есть несколько вещей, которые не так с вашим запросом.

Во-первых, вам не хватает агрегатной функции в вашем 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 с демо

Для 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
Другие вопросы по тегам