sql - 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 |
+-------+-------+-------+-------+-------+
解决方案
不幸的是,它出现PIVOT
在 Snowflake 中与PIVOT
SQL Server 中的类似,因此不支持这种形式的子查询。因此,开发人员必须使用过程语言扩展 (T-SQL) 创建动态查询,以动态生成透视列。
与IN
用于WHERE
orON
子句的逻辑表达式不同,IN
在PIVOT
查询中使用会生成列,并且可能必须提前硬编码以定义结果集的结构。
顺便说一句,作为一种特殊用途的声明性语言,SQL 可能无法与像 Python 这样的通用解释性语言相比,它允许数据元素的更多动态属性。
推荐阅读
- python - 气流:使用通配符从 S3 下载最新文件
- mysql - JMeter JDBC 手动提交
- kubernetes - Kubernetes cronjob 无法访问数据库服务
- python - 使用 matplotlib 在热图中绘制 x、y、数据
- android - 如何通过将鼠标悬停在 android studio 中的小部件上(如 Visual Studio Code)来获取定义
- javascript - 为什么我的网站设计在省略“www.”时无法正确加载?从网址?
- android - 延迟重复协程
- c++ - 为什么我最后需要从 while 条件中减去 7 才能使我的代码正常工作
- javascript - Vue v-for循环点击事件影响所有项目
- api - Docusign 签名休息 api 结构错误 - 找不到收件人