mysql - 根据条件过滤sql查询

标签 mysql sql

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

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

我期望的是这样的:

Select clients whose first order was placed in 2017 and calculate how much income was genereted in 2018 (total) per each of them.

我尝试过的是:

 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 年订购过?

最佳答案

  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;

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

关于mysql - 根据条件过滤sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957774/

相关文章:

mysql 计算 where 子句中给出的所有 id 并计算剩余的其余部分

java - UNSIGNED BIGINT 的 jOOQ 函数生成生成 LONG 而不是 ULONG

sql - CHECK (table1.integer >= table2.integer)

sql - 从两个日期列生成日期范围

sql - 如果超过 15 行,则向表中插入与打开行数相等的行数

php - 如何查询两个变量以返回一个结果?

java - 来自 JSP 的文本框值无法插入到数据库中

c++ -/gs 选项导致程序抛出异常

php - 对子查询 mysql 使用 IN 之外的其他内容

php - 返回整数和整数+字符串的MySQL SELECT查询