首页 > 解决方案 > SQL 中 df.pivot_table 自动宽列生成的等价物

问题描述

在带有 pandas 的 python 中,df.pivot_table需要一个index、一个列表columns和一个aggfunc. 有了这些信息,表格就会从长到宽。至关重要的是,如果您给它一个列列表,它将根据这些列的组合自动创建新的宽列。我看到的所有 SQL 示例 (a) 仅使用单个列(可以通过连接来解决)和 (b) 它们显式写出所有新的宽列名称,而不是根据不同的值生成它们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 |
+-------+-------+-------+-------+-------+

标签: sqlpandaspivot-table

解决方案


不幸的是,它出现PIVOT在 Snowflake 中与PIVOTSQL Server 中的类似,因此不支持这种形式的子查询。因此,开发人员必须使用过程语言扩展 (T-SQL) 创建动态查询,以动态生成透视列。

IN用于WHEREorON子句的逻辑表达式不同,INPIVOT查询中使用会生成列,并且可能必须提前硬编码以定义结果集的结构。

顺便说一句,作为一种特殊用途的声明性语言,SQL 可能无法与像 Python 这样的通用解释性语言相比,它允许数据元素的更多动态属性。


推荐阅读