【问题标题】:Sql query with an OR operator between a HAVING and WHERE clause在 HAVING 和 WHERE 子句之间使用 OR 运算符的 Sql 查询
【发布时间】:2018-01-02 10:26:54
【问题描述】:

是否可以在单个 SQL 查询中结合 OR 运算符中的 have 和 where 子句?

也许不是最好的例子,但你会明白的:

从员工表中选择部门,即 HR(使用 where 子句)或支付所有员工超过 25000 美元的部门(使用 having 子句)。 那么我们如何在下面的查询中获得 OR 条件呢?还是将查询分成 2 个查询会更好。

SELECT dept, SUM (salary) 
FROM employee 
WHERE dept = "HR"
GROUP BY dept 
HAVING SUM (salary) > 25000

【问题讨论】:

  • 您可以在 where 子句中放置多个条件,只要在 having 子句中放置的列是 select 查询的一部分。

标签: mysql sql database


【解决方案1】:

以下将起作用 - 您不必在 HAVING 子句中指定聚合

SELECT dept, SUM (salary) 
FROM employee 
GROUP BY dept 
HAVING dept = "HR" or SUM (salary) > 25000

但你的说法“支付所有员工超过 25000 元”并不清楚。你要吗

所有员工每人收入超过 25000 的部门,或 所有员工总收入超过25000的部门?

上面的查询为您提供了第二个选项,因为它最接近您的原始查询

【讨论】:

    【解决方案2】:

    GROUP BY 部分包装在派生表中。然后将条件应用于其结果:

    select dept, salarysum
    from
    (
        SELECT dept, SUM (salary) as salarysum
        FROM employee 
        GROUP BY dept
    ) dt
    where salarysum > 25000 or dept = "HR"
    

    或者,也许,“支付所有员工超过 25000”,意味着没有部门员工的收入低于 25000?

    select dept, minsalary
    from
    (
        SELECT dept, MIN(salary) as minsalary
        FROM employee 
        GROUP BY dept
    ) dt
    where minsalary > 25000 or dept = "HR"
    

    【讨论】:

      【解决方案3】:

      也许你想要所有薪水超过 25000 的部门。

      drop table if exists employees;
      create table employees(id int auto_increment primary key, dept varchar(2), salary int);
      
      insert into employees (dept,salary)
      values
      ('HR',10000),('aa',10000),('aa',45000),('bb',25000),('cc',26000),('cc',26000);
      
      select dept,sum(salary) sumsalary,count(*) obs, sum(case when salary > 25000 then 1 else 0 end) over25000
      from employees
      group by dept having obs = over25000 or dept = 'hr'
      
      +------+-----------+-----+-----------+
      | dept | sumsalary | obs | over25000 |
      +------+-----------+-----+-----------+
      | cc   |     52000 |   2 |         2 |
      | HR   |     10000 |   1 |         0 |
      +------+-----------+-----+-----------+
      2 rows in set (0.01 sec)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-07
        • 2010-11-21
        • 1970-01-01
        • 2018-01-08
        • 2021-10-25
        • 1970-01-01
        相关资源
        最近更新 更多