【问题标题】:About correct use of sum in case statement关于 case 语句中 sum 的正确使用
【发布时间】:2018-09-09 14:13:40
【问题描述】:

有一个表“payments”

user_id     payment_time    amount    sale_type
1            2018-04-01      10       cash
1            2018-04-01      10       cash
1            2018-04-01      10       cash
1            2018-04-01      20       bank
2            2018-04-01      10       cash
2            2018-04-01      10       cash

需要现金。

我不明白为什么这个查询会给出错误的结果:

select SUM(CASE WHEN p1.sale_type='cash' THEN p1.amount ELSE 0 END) 
as cash
FROM 
(SELECT distinct user_id, SUM(amount) AS amount, sale_type FROM payments where 
payment_time = '2018-04-01' group by user_id) p1 

【问题讨论】:

    标签: mysql sql database join select


    【解决方案1】:

    您需要将 sale_type 列添加到内部查询的 GROUP BY 语句中,并且应该是 group by user_id, sale_type 以获得适合您的查询样式的正确结果。

    附:实际上,我认为您不需要子查询。

    上面的查询结果为60,而

    select SUM(CASE WHEN p1.sale_type='cash' THEN p1.amount ELSE 0 END) as cash
      from 
     (select distinct user_id, SUM(amount) AS amount, sale_type 
        from payments 
       where payment_time = date'2018-04-01' 
       group by user_id, sale_type) p1;
    

    select SUM(CASE WHEN sale_type='cash' THEN amount ELSE 0 END) as cash 
      from payments 
     where payment_time = date'2018-04-01'
    

    为结果 cash 列提供 40

    SQL Fiddle Demo

    【讨论】:

      【解决方案2】:

      为什么不使用为此目的而制定的“Having”子句。

      SELECT SUM(amount) AS cash FROM payments
      WHERE payment_time = '2018-04-01'
      GROUP BY sale_type
      HAVING sale_type= 'cash'
      

      【讨论】:

        【解决方案3】:

        我认为您的子查询或整个子查询中可能根本不需要distinct

        select p.user_id as id, sum(case when p.sale_type = 'cash' then p.amount else 0 end) as amount
        from payments p 
        where p.payment_time = '2018-04-01' 
        group by p.user_id
        

        或者没有case

        select p.user_id, sum(p.amount)
        from payments p 
        where p.sale_type = 'cash' and p.payment_time = '2018-04-01' 
        group by p.user_id
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多