每个聚合函数的sql predicate

os8fio9y  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(314)

我正在处理sql查询,
查询:
我想找到一个医院名单,上面有牙医(is_denitist=true)和所有月收入>100000的医生(包括牙医)
我有两张table,医院和医生的图表如下,

-------------
| Hospital  |
|-----------|
| id | name |
|-----------|

---------------------------------------------------------
|             Doctor                                    |    
|--------------------------------------------------------
| id | name | monthly_income | is_dentist | hospital_id |
|--------------------------------------------------------

我提出的问题是,

select h.name, count(d.is_dentist), sum(d.monthly_income)
from Hospital h inner join Doctor d
on h.id = d.hospital_id
where d.monthly_income > 100000 and d.is_dentist=true
group by h.name;

如果我是一名牙医,收入低于10万,那么医院仍应将我算作牙医。
但上述查询中需要注意的是,它过滤掉了所有月收入在10万以上的医生和牙医。我需要这些条件的独立计数,比如每个count()列上的 predicate 。如何在单个查询中实现这一点?

5hcedyr0

5hcedyr01#

你可以做条件聚合。
is_dentist (大概)包含 0 / 1 价值观,你可以 sum() 这一栏用来统计有多少医生属于这个组。
另一方面,可以使用另一个条件 sum() 统计一下有多少医生的收入超过了门槛。

select 
    h.name, 
    sum(d.is_dentist) no_dentists, 
    sum(d.monthly_income > 100000) no_doctors_above_100000_income
from Hospital h 
inner join Doctor d on h.id = d.hospital_id
group by h.name;
woobm2wo

woobm2wo2#

您有两个独立的条件(月收入>100000,并且为true),这意味着有两个不同的数据集。不能在同一组查询中使用两个不同的数据集。所以你需要把它分成两个子查询。您可以检查以下查询结果是否是您想要的:

select temp3.name, temp1.dentist_count, temp2.income_count from 
(select d1.hospital_id, count(*) as dentist_count from Doctor d1 where d1.monthly_income>100000 group by d1.hospital_id) as temp1
join
(select d2.hospital_id, count(*) as income_count from Doctor d2 where d2.is_dentist=true group by d2.hospital_id) as temp2
on temp1.hospital_id=temp2.hospital_id
join 
(select h.id, h.name from Hospital h) as temp3
on temp2.hospital_id=temp3.id;

相关问题