2

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

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

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

例如,下面的查询将显示一个 Quintile 的数据价值:

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

我基本上得到了有效数据的对角线。Quintile 不是 1 的所有行仍然显示,填充为 NULL,然后对于 Quintile 2 以此类推。

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

有没有一种不涉及嵌套连接类型语句的方法?

4

2 回答 2

2

由于您希望多行输入数据只有一行输出,因此您必须汇总您的值。在这种情况下,您希望按 对它们进行分组yearmonth。一种可能(虽然不是特别便携)的方式如下:

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

这种略显老套的方法利用了这样一个事实,即Quintile=1MySQL 中的比较会产生一个整数,分别0代表 false 和1true。因此,您选择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
于 2012-12-11T15:56:29.907 回答
1

您可以使用GROUP BY为每个值仅显示一行yearmonth,然后使用 SUM() 以及 IF() 语句,以便ret仅当列的 IF() 条件评估为 TRUE 时才对 VALUES 求和:

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() 语句的想法是正确的。

于 2012-12-11T15:56:10.750 回答