Ответ 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