Транспонировать некоторые столбцы в строки, используя сводку с 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