【问题标题】:Filtering a sql query based on a condition根据条件过滤 sql 查询
【发布时间】:2019-11-20 23:35:13
【问题描述】:

我有一个应该是这样的表:

CREATE TABLE orders
(
    order_number int PRIMARY KEY,
    client varchar(20),
    revenue int,
    fixed_transport_cost int,
    income int,
    order_date date
)

我的期望是这样的:

选择 2017 年首次下订单的客户并计算如何 他们每个人在 2018 年(总计)产生了很多收入。

我试过的是这样的:

 SELECT 
     clients, SUM(income) 
 FROM
     orders 
 HAVING 
     YEAR(order_date) = '2018' 
     AND income = ANY (SELECT income FROM orders 
                       WHERE YEAR(order_date) = '2017') 
 GROUP BY
     income;

但看起来查询不正确。我的问题是如何检查是否有人在 2017 年订购过?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    1. 首先,HAVING 子句应该放在 GROUP BY 子句之后。
    2. 其次,您应该检查 2017 年的第一笔订单,而不是 2017 年的任何订单。这是您要求的。事实上,这里不需要 HAVING。
    3. 您需要按客户分组,因为您正在寻找每个客户的收入总和(如果我理解得很好的话)。

    您可以尝试以下查询:

     SELECT 
         client, SUM(income) 
     FROM
         orders 
     WHERE
         YEAR(order_date) = '2018' 
         AND client IN (
              SELECT client 
              FROM orders 
              GROUP BY client 
              HAVING MIN(YEAR(order_date)) = '2017')
     GROUP BY
         client;
    

     SELECT 
         o1.client, SUM(o1.income) 
     FROM
         orders o1
     WHERE
         YEAR(o1.order_date) = '2018' 
         AND '2017' = (
              SELECT MIN(YEAR(o2.order_date))
              FROM orders o2
              WHERE o2.client = o1.client)
     GROUP BY
         o1.client;
    

    如果您希望我们尝试查询并给您演示,请提供数据样本。

    【讨论】:

    • 感谢您的回复。你能告诉我为什么你提到 HAVING 是不必要的吗?据我所知,只要有 group by,就应该使用它,不是吗?
    • HAVING 子句仅在您想对分组结果应用过滤器时才需要(即对返回的每个分组行进行过滤器)。如果在这个特定时刻不需要应用过滤器,那么在 group by 之后不需要有子句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2019-05-27
    • 2014-02-21
    相关资源
    最近更新 更多