繁体   English   中英

在HAVING和WHERE子句之间使用OR运算符的SQL查询

[英]Sql query with an OR operator between a HAVING and WHERE clause

是否可以在单个SQL查询中将OR运算符中的hading和where子句组合在一起?

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

从员工表中选择部门,这些部门是HR(使用where子句)或支付给所有员工25000以上的工资(使用hading子句)。 那么,如何在下面的查询中获得OR条件? 或者将查询分为两个查询会更好。

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

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

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

但是您的说法“向所有员工支付的薪水超过25000”尚不清楚。 你想要

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

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

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"

也许您想要部门所有薪水都超过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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM