如何在 group by 子句后应用 case when 语句

How to apply case when statement after group by clause

输入:

我有一个 table 看起来像:

    date   | is_shipped | is_realised | mrp  
----------+------------+-------------+------
 12022015 |          1 |           1 | 1000
 12022015 |          0 |           1 | 2000
 12022015 |          1 |           0 | 3000
 13022015 |          1 |           1 | 1500
 13022015 |          0 |           1 | 2500
 13022015 |          1 |           0 | 3500

问题陈述:

我想按日期对行进行分组以获得总的 mrp 以及对应于 is_shipped = 1is_realised = 1 的 mrp。例如,12022015上的总mrp为1000 + 2000 + 3000 = 6000。is_shipped = 112022015上对应的总mrp为1000 + 3000 = 4000。[=14=上对应的总mrp ] 在 12022015 上是 1000 + 2000 = 3000。

预期输出

所以,我的结果应该类似于:

    date   | shipped_mrp | realised_mrp | mrp  
----------+-------------+--------------+------
 12022015 |        4000 |         3000 | 6000
 13022015 |        5000 |         4000 | 7500

尝试的解决方案:

我尝试了以下查询,但它不起作用:

select sum(mrp),
CASE WHEN is_realised = 1
THEN 
    SUM(mrp)
ELSE
    0
END AS realised_mrp,
CASE WHEN is_shipped = 1
THEN 
    SUM(mrp)
ELSE
    0
END AS shipped_mrp
from rev
group by date;

错误:

我收到以下错误:

column "rev.is_realised" must appear in the GROUP BY clause or be used in an aggregate function LINE 2: CASE WHEN is_realised = 1

将 case 语句移动到 sum 函数中:

select 
  date, 
  sum(CASE WHEN is_shipped = 1 THEN mrp ELSE 0 END) AS shipped_mrp,
  sum(CASE WHEN is_realised = 1 THEN mrp ELSE 0 END) AS realised_mrp,
  sum(mrp) AS mrp
from rev
group by date;

Sample SQL Fiddle

如果使用 PG9.4+ 使用效率更高的 FILTER 子句:

SELECT "date",
       sum(mrp) FILTER (WHERE is_shipped = 1) AS shipped_mrp,
       sum(mrp) FILTER (WHERE is_realised = 1) AS realised_mrp,
       sum(mrp) AS mrp
FROM rev
GrOUP BY 1;