Эквивалент автоматической генерации широких столбцов df.pivot_table в SQL

#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, который обеспечивает более динамические свойства элементов данных.