group by 和 case when 的组合使用

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
;

猜你喜欢

转载自blog.csdn.net/weixin_43283487/article/details/120064587