Объяснение сводного запроса
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 новых столбцов, которых раньше не было. Что входит в колонку?
- Любой столбец, который появляется в выходном файле, но не является столбцом PIVOTed, является столбцом «GROUP BY».
- Функция агрегирования - это то, что собирает все данные в ячейку, которая является КРЕСТОМ между столбцами 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