group by 和 case when 的组合使用
今天有个人问了一个group by 和 case when 使用时为什么会报错的问题,大致原因和解决方案就是下面
会遇到的问题
SELECT uid
,SUM(pay_money) AS pay_money
,CASE WHEN STATUS = 1 THEN SUM(pay_money)
END AS finish_pay_money
FROM test_order
GROUP BY uid
;
因为此时他不是聚合时判断 status 是否为 1 ,而是先找到聚合的 key 里 status 这个字段为 1 时这条数据,在去拿到这个数据的值
你需要这样写
SELECT uid
,SUM(pay_money) AS pay_money
,SUM(CASE WHEN STATUS = 1 THEN pay_money END) AS finish_pay_money
FROM test_order
GROUP BY uid
;
此时我聚合时,判断 status 是否为 1 ,由此得出聚合值
还不明白看这个sql
SELECT uid
,STATUS
,SUM(pay_money) AS pay_money
,CASE WHEN STATUS = 1 THEN SUM(pay_money)
END AS finish_pay_money
FROM test_order
GROUP BY uid
,STATUS
;
总结
group by 后 非聚合字段 不能出现在 聚合函数外部,例如上面这个 sql ,他其实聚合完了,然后判断你这个值应不应该在这条数据里
建表语句
-- uid:用户id ,sex:性别(女-0),status:订单状态(0-未完成,1-完成),pay_money:消费金额
CREATE TABLE IF NOT EXISTS test_order AS
SELECT
9512 AS uid
,0 AS sex
,1 AS STATUS
,11 AS pay_money
UNION ALL
SELECT
9512 AS uid
,0 AS sex
,0 AS STATUS
,10 AS pay_money
UNION ALL
SELECT
9512 AS uid
,0 AS sex
,1 AS STATUS
,34 AS pay_money
UNION ALL
SELECT
9513 AS uid
,1 AS sex
,1 AS STATUS
,11 AS pay_money
;