MySQL:使用 IF 语句进行透视,但得到大量 NULL 值

标签 mysql pivot pivot-table

我有一些按五分位数标签组织的数据(-1、1、2、3、4、5)。对于 Quintile 列中的每个值,另一列中都有一个名为 ret 的值。最后,有一列日期,其中包含整数月末日期。

我的目标是同时可视化所有五分位数返回数据,每个数据都有自己的列,只有日期列充当索引。

本质上,我想以Quintile列为中心,并且我已经看到其他地方建议在MySQL中使用IF语句作为实现这一目标的方法。

例如,下面的查询将显示五分位数的数据:

select yearmonth, ret
where Quintile=1
from quintile_returns

但我不想对所有 Quintile 标签重复此操作,单独保存数据,然后在 Python Pandas 或 Excel 等中将其拼凑在一起。我想让 SQL 将其显示为不同的列。

但是当我尝试这个 IF 语句风格的穷人的枢纽时,这是我使用的查询:

select yearmonth, 
       IF(Quintile=1, ret, NULL) as Q1_ret,
       IF(Quintile=2, ret, NULL) as Q2_ret
from quintile_returns

我基本上得到了有效数据的对角线。五分位数不为 1 的所有行仍然显示,并用 NULL 填充,然后对于五分位数 2 依此类推。

如何避免所有这些额外的 NULL 值?基本上,我想告诉 SQL 仅在满足条件时才返回列的值,并且不要使用 NULL 或其他任何内容作为默认的类似 else 的占位符。

有没有一种方法可以做到这一点而不涉及嵌套连接类型语句?

最佳答案

由于您只想为多行输入数据提供一行输出,因此必须聚合您的值。在本例中,您希望按年月对它们进行分组。一种可能的(尽管不是特别便携)方法如下:

SELECT yearmonth
     , SUM((Quintile=1)*ret) AS Q1
     , SUM((Quintile=2)*ret) AS Q2
FROM quintile_returns
GROUP BY yearmonth

这种有点黑客的方法利用了这样一个事实,即 MySQL 中的 Quintile=1 等比较会产生一个整数,0 表示 false,1 > 为真。因此,您可以将 1*ret=ret 视为匹配的五分位数,将 0*ret=0 视为其他匹配的五分位数。如果你想让事情更清晰、更便携,你也可以写成

SELECT yearmonth
     , SUM(IF(Quintile=1, ret, 0)) AS Q1
     , SUM(IF(Quintile=2, ret, 0)) AS Q2
FROM quintile_returns
GROUP BY yearmonth

关于MySQL:使用 IF 语句进行透视,但得到大量 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13823324/

相关文章:

sql - Postgresql - 列数未知的数据透视表

mysql - 将 MySQL 与 dev_appserver (Google App Engine) 和 Google SQL 服务一起使用

javascript - 用Highcharts绘制实时数据图

pivot - openrefine可以做汇总表吗?

sql - postgresql 中的数据透视表

excel - VBA - 测试一个值是否是 PivotField 的有效选择

mysql - 通过 Rails 将 SQL 文件或 Excel 文件中的数据导入数据库

MySQL查询MYSQL自增字段的下一个序号

python - 高斯消元法 - 在 python 中使用切片进行旋转

pandas - ValueError : Index contains duplicate entries, 无法 reshape