#sql #pandas #pivot-table
#sql #панды #сводная таблица #pandas
Вопрос:
В python с pandas df.pivot_table принимает index
, список columns
и aggfunc
. С учетом этой информации затем таблица поворачивается от длинной к широкой. Важно отметить, что если вы предоставите ему список столбцов, он автоматически создаст новые широкие столбцы на основе комбинации этих столбцов. Все примеры SQL, которые я вижу, хотя (а) используют только один столбец (который может быть решен с помощью конкатенации) и (б) они явно выписывают все новые широкие имена столбцов, а не генерируют их на основе различных значений в columns.
Когда я пытаюсь использовать подзапрос для создания широкого списка из столбца в SQL, я получаю ошибку Single-row subquery returns more than one row.
Поэтому, например, я хотел бы заменить месяцы в следующем запросе подзапросом к таблице месяцев, но это выдает эту ошибку. Это пример того, что я пытаюсь сделать, преобразованный в использование вложенного запроса, который выдает ошибку.
select *
from monthly_sales
//pivot(sum(amount) for month in ('JAN', 'FEB', 'MAR', 'APR'))
pivot(sum(amount) for month in ((SELECT DISTINCT month FROM MONTHS))
as p
order by empid;
------- ------- ------- ------- -------
| EMPID | 'JAN' | 'FEB' | 'MAR' | 'APR' |
|------- ------- ------- ------- -------|
| 1 | 10400 | 8000 | 11000 | 18000 |
| 2 | 39500 | 90700 | 12000 | 5300 |
------- ------- ------- ------- -------
Ответ №1:
К сожалению, это появляется PIVOT
в Snowflake аналогично PIVOT
в SQL Server и, следовательно, не поддерживает подзапросы в этой форме. Следовательно, разработчики должны создавать динамические запросы с расширениями процедурного языка (T-SQL) для динамической генерации сводных столбцов.
В отличие от IN
используемых в логических выражениях предложений WHERE
or ON
, IN
используемый в PIVOT
запросах, генерирует столбцы и, вероятно, должен быть жестко запрограммирован заранее, чтобы определить структуру результирующего набора.
Кроме того, будучи языком специального назначения, декларативным языком, SQL может быть несопоставим с языком общего назначения, интерпретирующим язык, такой как Python, который обеспечивает более динамические свойства элементов данных.