我会帮你解决第一个问题,第二个问题留给你。
- 显示治疗过一名以上患者的医生收到的医生ID、名称、总费用?
让我们把这个问题分成几部分:
因此,您首先需要知道哪些医生治疗过不止一名患者。该信息在表中billing
。所以:
select doctorId, count(patientId) as patientCount
from (select distinct doctorId, patientId from billing) as a
group by doctorId
having count(patientId)>1;
此查询将仅返回拥有多个患者的医生的 ID。请注意,我正在使用子查询对医患元组进行重复数据删除。
现在让我们攻击这个问题的另一部分:每位医生的总费用。同样,该信息在表中billing
:
select doctorId, sum(fees) as totalFees
from billing
group by doctorId;
最后,让我们把它们放在一起,并包括医生的信息,它在表格中doctor
:
select
d.doctorId, d.doctorName, a.totalFees
from
doctor as d
inner join (
select doctorId, sum(fees) as totalFees
from billing
group by doctorId
) as a on d.doctorId = a.doctorId
inner join (
select doctorId, count(patientId) as patientCount
from (select distinct doctorId, patientId from billing) as a
group by doctorId
having count(patientId)>1;
) as b on d.doctorId = b.doctorId;
希望这可以帮助
您需要学习和(或)记住的事情:
- 您需要了解如何关联存储在不同表中的数据。学习如何使用
INNER JOIN
(and also LEFT JOIN
and RIGHT JOIN
)
- 您需要了解它是如何
GROUP BY
工作的,以及如何使用聚合函数(sum()
、、count()
等等)。
- 您知道如何编写子查询。现在尝试不仅将它们用于
where
条件,而且将它们用作数据源(包括它们在from
语句中)
- 手头保留一份 RDBMS 参考手册的副本。一本关于 SQL 的好书也可以帮助你(去书店或图书馆找到你喜欢的书)。