MySQL:使用IF语句来透视,但得到大量空值

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

我有一些按五分位数标签组织的数据(-1,1,2,3,4,5)。对于
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