Я новичок в SQL.
У меня есть такая таблица:
ID | TeamID | UserID | ElementID | PhaseID | Effort
-----------------------------------------------------
1 | 1 | 1 | 3 | 5 | 6.74
2 | 1 | 1 | 3 | 6 | 8.25
3 | 1 | 1 | 4 | 1 | 2.23
4 | 1 | 1 | 4 | 5 | 6.8
5 | 1 | 1 | 4 | 6 | 1.5
И мне сказали получить такие данные
ElementID | PhaseID1 | PhaseID5 | PhaseID6
--------------------------------------------
3 | NULL | 6.74 | 8.25
4 | 2.23 | 6.8 | 1.5
Я понимаю, что мне нужно использовать функцию PIVOT. Но не могу понять это ясно. Было бы здорово, если бы кто-нибудь мог объяснить это в приведенном выше случае. (Или любые альтернативы, если таковые имеются)
PhaseID
перед QUOTENAME. правильно?SELECT distinct '],['
, а также в конце инструкции1, 2, '') + ']'
Это самый простой пример поворота, пожалуйста, рассмотрите его.
SQL SERVER - Примеры таблиц PIVOT и UNPIVOT
Пример из приведенной выше ссылки для таблицы продуктов:
SELECT PRODUCT, FRED, KATE FROM ( SELECT CUST, PRODUCT, QTY FROM Product) up PIVOT (SUM(QTY) FOR CUST IN (FRED, KATE)) AS pvt ORDER BY PRODUCT
оказывает:
PRODUCT FRED KATE -------------------- BEER 24 12 MILK 3 1 SODA NULL 6 VEG NULL 5
Подобные примеры можно найти в сообщении блога « Сводные таблицы в SQL Server». Простой образец
источник
SELECT CUST, VEG, SODA FROM (SELECT rand() as x, CUST, PRODUCT, QTY FROM Product) up PIVOT ( SUM(x) FOR PRODUCT IN (VEG, SODA) ) AS pvt ORDER BY CUST GO
Для того, чтобы это сработало, вы должны удалитьqty
столбец из источникаЯ могу добавить сюда кое-что, о чем никто не упомянул.
pivot
Функция отлично работает , когда источник имеет 3 колонки: однаaggregate
, одна разрастись колонн сfor
, и один в качестве опоры дляrow
распределения. В примере продукта этоQTY, CUST, PRODUCT
.Однако, если у вас больше столбцов в источнике, он разбивает результаты на несколько строк вместо одной строки на сводную таблицу на основе уникальных значений для каждого дополнительного столбца (как это
Group By
было бы в простом запросе).См. Этот пример, ive добавил столбец с отметкой времени в исходную таблицу:
Теперь посмотрим на его влияние:
SELECT CUST, MILK FROM Product -- FROM (SELECT CUST, Product, QTY FROM PRODUCT) p PIVOT ( SUM(QTY) FOR PRODUCT IN (MILK) ) AS pvt ORDER BY CUST
Чтобы исправить это, вы можете использовать подзапрос в качестве источника, как все делали выше, - всего с 3 столбцами (это не всегда сработает для вашего сценария, представьте, если вам нужно поставить
where
условие для временной метки).Второе решение - использовать
group by
и снова суммировать значения поворотного столбца.SELECT CUST, sum(MILK) t_MILK FROM Product PIVOT ( SUM(QTY) FOR PRODUCT IN (MILK) ) AS pvt GROUP BY CUST ORDER BY CUST GO
источник
Сводная диаграмма используется для преобразования одного из столбцов в наборе данных из строк в столбцы (обычно это называется столбцом распространения ). В приведенном вами примере это означает преобразование
PhaseID
строк в набор столбцов, где есть один столбец для каждого отдельного значения, котороеPhaseID
в данном случае может содержать - 1, 5 и 6.Эти сводные значения сгруппированы по
ElementID
столбцу в приведенном вами примере.Обычно вам также необходимо предоставить некоторую форму агрегации, которая дает вам значения, на которые ссылается пересечение значения распределения (
PhaseID
) и значения группировки (ElementID
). Хотя в приведенном примере агрегирование, которое будет использоваться, неясно, но включаетEffort
столбец.После этого поворота столбцы группировки и распространения используются для поиска значения агрегирования . Или в вашем случае
ElementID
иPhaseIDX
ищитеEffort
.Используя терминологию группировки, распределения и агрегации, вы обычно увидите пример синтаксиса для сводной таблицы:
WITH PivotData AS ( SELECT <grouping column> , <spreading column> , <aggregation column> FROM <source table> ) SELECT <grouping column>, <distinct spreading values> FROM PivotData PIVOT (<aggregation function>(<aggregation column>) FOR <spreading column> IN <distinct spreading values>));
Это дает графическое объяснение того, как столбцы группировки, распределения и агрегации преобразуются из исходных таблиц в сводные, если это помогает в дальнейшем.
источник
Чтобы установить ошибку совместимости
используйте это перед использованием функции поворота
ALTER DATABASE [dbname] SET COMPATIBILITY_LEVEL = 100
источник
SELECT <non-pivoted column>, [first pivoted column] AS <column name>, [second pivoted column] AS <column name>, ... [last pivoted column] AS <column name> FROM (<SELECT query that produces the data>) AS <alias for the source query> PIVOT ( <aggregation function>(<column being aggregated>) FOR [<column that contains the values that will become column headers>] IN ( [first pivoted column], [second pivoted column], ... [last pivoted column]) ) AS <alias for the pivot table> <optional ORDER BY clause>; USE AdventureWorks2008R2 ; GO SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost FROM Production.Product GROUP BY DaysToManufacture; DaysToManufacture AverageCost 0 5.0885 1 223.88 2 359.1082 4 949.4105 -- Pivot table with one row and five columns SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] FROM (SELECT DaysToManufacture, StandardCost FROM Production.Product) AS SourceTable PIVOT ( AVG(StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS PivotTable; Here is the result set. Cost_Sorted_By_Production_Days 0 1 2 3 4 AverageCost 5.0885 223.88 359.1082 NULL 949.4105
источник
<SELECT query that produces the data>
не просто стол?