Пожалуйста, объясните части PIVOT

Я прочитал много сообщений в блогах. Я прочитал документы. Обычно я хорошо разбираюсь в новых материалах, но хотя я продолжаю читать, но я просто не понимаю части PIVOT в SQL Server (2008).

Может кто-то, пожалуйста, дайте мне это, приятно и медленно. (т.е. "Сводка для чайников" )

Если вам нужен пример, мы можем использовать в этом вопросе.

Вот как я попытался развернуть этот пример:

SELECT OtherID, Val1, Val2, Val3, Val4, Val5
FROM 
    (SELECT OtherID, Val
    FROM @randomTable) p
PIVOT
(
    max(val)
    FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;

Вышеуказанный запрос дает мне nulls вместо значений в столбцах Val1, Val2...

Но чтобы быть понятным, Я не ищу фиксированный запрос здесь. Мне нужно понимать PIVOT, поскольку я ищу, чтобы сделать что-то гораздо более сложное, чем этот пример.

В частности, какова сделка с совокупностью? Я просто хочу взять все строковые значения, которые соответствуют указанному идентификатору, и поместить их в одну строку. Я не пытаюсь ничего агрегировать. (Опять же, см. этот вопрос для моего примера.)

Ответ 1

Объяснение сводного запроса

FROM 
    (SELECT OtherID, Val, amount
    FROM @randomTable) p

Это столбцы, которые становятся "базовыми данными" для стержня. Не включайте столбцы, которые ничего не делают. Так же, как вы не ставите столбцы не GROUP BY в предложение SELECT, вы не указываете неиспользуемые столбцы в источнике PIVOT.

PIVOT
(
    max(amount)
    FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;

В этой части говорится, что вы создаете 5 новых столбцов с именем "Val1" через "Val5". Эти имена столбцов представляют значения в столбце Val. Поэтому ожидается, что в вашей таблице будет что-то вроде этого

otherID   Val     amount
1         Val1    1
2         Val2    2
1         Val3    3
1         Val1    5
(etc)     (this column contains one of Val1 - Val5, or null)

Итак, теперь у вас есть 5 новых столбцов, которые раньше не существовали. Что входит в колонку?

  • Любой столбец, который отображается в OUTPUT, который не является столбцом PIVOTed, является столбцом "GROUP BY".
  • Агрегатная функция - это то, что собирает все данные в ячейке, которая является CROSS между столбцами GROUP BY и столбцом PIVOTED.

Итак, чтобы проиллюстрировать, используя приведенные выше данные примера, мы имеем otherID = 1 и val = Val1. В выходной таблице есть только одна ячейка, представляющая эту комбинацию Max (количество) для каждой комбинации (otherID/val)

otherID   Val1   Val2   Val3   Val4   Val5
1         <x>    ...    ...    ...    ...
(etc)

Для ячейки с меткой <x> допускается только одно значение, поэтому <x> не может содержать несколько значений amount. Именно по этой причине нам необходимо его заполнить, в этом случае используя MAX(amount). Таким образом, на самом деле вывод выглядит следующим образом:

(unpivoted columns)   (pivoted, creates "new" columns)
otherID             |  Val1          Val2           Val3   Val4   Val5
1                   |  MAX(amount)   Max(amount)    << cell value = aggregate function
(etc)

Оператор SELECT - это то, что затем выводит эти столбцы

SELECT OtherID, Val1, Val2, Val3, Val4, Val5