MySQL:使用IF语句来透视,但得到大量空值
我有一些按五分位数标签组织的数据(-1,1,2,3,4,5)。对于MySQL:使用IF语句来透视,但得到大量空值,mysql,pivot,pivot-table,Mysql,Pivot,Pivot Table,我有一些按五分位数标签组织的数据(-1,1,2,3,4,5)。对于Quintile列中的每一个值,在另一个名为ret的列中都有一个值。最后,还有一列日期,其中包含整数形式的月末日期 我的目标是同时可视化所有五分位返回数据,每个都作为自己的列,只有日期列充当索引 本质上,我想重点讨论Quintile列,我还看到其他地方建议在MySQL中使用IF语句来实现这一点 例如,下面的查询将显示五分之一的数据: select yearmonth, ret where Quintile=1 from quint
Quintile
列中的每一个值,在另一个名为ret
的列中都有一个值。最后,还有一列日期,其中包含整数形式的月末日期
我的目标是同时可视化所有五分位返回数据,每个都作为自己的列,只有日期列充当索引
本质上,我想重点讨论Quintile
列,我还看到其他地方建议在MySQL中使用IF
语句来实现这一点
例如,下面的查询将显示五分之一的数据:
select yearmonth, ret
where Quintile=1
from quintile_returns
但我不想对所有五分位标签重复这一点,单独保存数据,然后用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
如何避免所有这些额外的空值?基本上,我想告诉SQL仅当满足条件时才返回列的值,并且不要使用NULL或其他任何东西作为默认的类似于的占位符
有没有一种方法不涉及嵌套的联接类型语句?您可以使用GROUP BY
为每个yearmonth
值只显示一行,然后使用SUM()和IF()语句,这样只有当列的IF()条件计算为TRUE时,ret
值才会求和:
SELECT `yearmonth`,
SUM(IF(`Quintile` = 1, ret, NULL)) as `Q1_ret`,
SUM(IF(`Quintile` = 2, ret, NULL)) as `Q2_ret`
FROM `quintile_returns`
GROUP BY `yearmonth`
否则,您对IF()语句的想法是正确的。由于您希望多行输入数据只有一行输出,因此必须聚合您的值。在这种情况下,您希望按yearmonth
对它们进行分组。一种可能的方法(尽管不是特别便携)是:
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
表示true。因此,您将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