【问题标题】:How can I combine two queries with a having clause into one?如何将两个带有有子句的查询合并为一个?
【发布时间】:2016-01-07 14:18:35
【问题描述】:

希望你能帮我解决这两个查询:

select count(distinct ID), sum(AMOUNT) 
from SALES 
where YEAR(SALEDATE) = '2015' and SALETYPE ='CASH'
group by CUSTOMER having sum(AMOUNT) >=500;

select count(distinct ID), sum(AMOUNT) 
from SALES 
where YEAR(SALEDATE) = '2015' and SALETYPE ='CREDITCARD'
group by CUSTOMER having sum(AMOUNT) >=1000;

将它们合二为一的最佳方法是什么?我的目标是选择客户以现金支付超过 500 美元或通过信用卡支付超过 1000 美元的所有案例。

非常感谢您的帮助。

【问题讨论】:

    标签: mysql sql having


    【解决方案1】:

    在你的情况下,你可以使用这个例子:

    select  count(distinct ID), 
            sum(AMOUNT) 
    from    SALES 
    where   YEAR(SALEDATE) = '2015' 
        and SALETYPE ='CASH' 
    group by CUSTOMER 
    having  sum(AMOUNT) >=500;
    
    UNION
    
    select  count(distinct ID), 
            sum(AMOUNT) 
    from    SALES 
    where   YEAR(SALEDATE) = '2015' 
        and SALETYPE ='CREDITCARD' 
    group by CUSTOMER 
    having  sum(AMOUNT) >=1000;
    

    OR UNION ALL,如果你想要所有没有distinct的记录。

    select  count(distinct ID), 
            sum(AMOUNT) 
    from    SALES 
    where   YEAR(SALEDATE) = '2015' 
        and SALETYPE ='CASH' 
    group by CUSTOMER 
    having  sum(AMOUNT) >=500;
    
    UNION ALL
    
    select  count(distinct ID), 
            sum(AMOUNT) 
    from    SALES 
    where   YEAR(SALEDATE) = '2015' 
            and SALETYPE ='CREDITCARD' 
    group by CUSTOMER 
    having  sum(AMOUNT) >=1000;
    

    【讨论】:

      【解决方案2】:

      having 子句中使用条件聚合:

      select count(distinct ID), sum(AMOUNT) 
      from SALES 
      where YEAR(SALEDATE) = '2015' and 
            SALETYPE IN ('CASH', 'CREDITCARD')
      group by CUSTOMER
      having sum(case when SALETYPE = 'CASH' then AMOUNT end) >= 50 OR
             sum(case when SALETYPE = 'CREDITCARD' then AMOUNT end) >= 1000;
      

      【讨论】:

      • 非常感谢。你的书看起来也很有用。但是,不应该是 OR 而不是 AND 吗? having sum(case when SALETYPE = 'CASH' then AMOUNT end) >= 50 OR(!) sum(case when SALETYPE = 'CREDITCARD' then AMOUNT end) >= 1000;
      • @user1269766 。 . .是的。我读过这个问题,希望同时满足这两个条件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多