Пожалуйста, объясните части PIVOT - PullRequest
14 голосов
/ 26 марта 2011

Я прочитал много постов в блоге. Я прочитал документы. Я обычно довольно хорошо разбираюсь в новых вещах, но хотя я продолжаю читать, но я просто не понимаю части 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;

Приведенный выше запрос возвращает значения NULL вместо значений в столбцах Val1, Val2 ...

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

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

1 Ответ

19 голосов
/ 26 марта 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...