我有一些按五分位数标签组织的数据(-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/