我正在尝试在数据库中找出剂量最大的患者。必须计算出剂量的总和,然后我必须动态列出已经接受过如此剂量的患者。查询必须是动态的,并且列出的患者可能超过5个-例如,最多的5个剂量是7,6,5,4,3个剂量,但是3个人已经获得了5个剂量,所以我必须列出总共7人(接受7,6,5,5,5,5,4,3剂的患者)。我遇到了问题,因为您无法在where子句中引用命名列,而且我也不知道如何解决此问题。
查询如下:
SELECT
info.NAME, SUM(therapy.DOSE) AS total
FROM
dbo.PATIENT_INFORMATION_TBL info
JOIN
dbo.PATIENT_THERAPY_TBL therapy ON info.HOSPITAL_NUMBER = therapy.HOSPITAL_NUMBER
LEFT JOIN
dbo.FORMULARY_CLINICAL clinical ON clinical.ITEMID = therapy.ITEMID
WHERE
total IN (SELECT DISTINCT TOP 5 SUM(t.DOSE) AS 'DOSES'
FROM dbo.PATIENT_INFORMATION_TBL i
JOIN dbo.PATIENT_THERAPY_TBL t ON i.HOSPITAL_NUMBER = t.HOSPITAL_NUMBER
LEFT JOIN dbo.FORMULARY_CLINICAL c ON c.ITEMID = t.ITEMID
GROUP BY NAME
ORDER BY 'DOSES' DESC)
GROUP BY
info.NAME
ORDER BY
total DESC
数据库如下:
主要问题是:如何在需要将计算列与动态计算值列表进行比较的地方使用where / having子句?
我正在使用Microsoft的SQL Server2012。需要在子查询中使用DISTINCT
,以便仅显示前5个剂量(例如,不 DISTINCT
,我得到{{ 1}} 与 7,6,5,4,3
一起获得DISTINCT
,我的目标是第一个)。
答案 0 :(得分:0)
大多数DBMS支持标准SQL 分析功能,例如"data": [
:
DENSE_RANK
顺便说一句,您可能不需要LEFT JOIN,因为您没有从with cte as
(
SELECT info.NAME, SUM(therapy.DOSE) as total,
DENSE_RANK() OVER (ORDER BY SUM(therapy.DOSE) DESC) AS dr
FROM dbo.PATIENT_INFORMATION_TBL info
JOIN dbo.PATIENT_THERAPY_TBL therapy ON info.HOSPITAL_NUMBER=therapy.HOSPITAL_NUMBER
LEFT JOIN dbo.FORMULARY_CLINICAL clinical ON clinical.ITEMID=therapy.ITEMID
GROUP BY info.NAME
)
select *
from cte
where dr <= 5 -- only the five highest doses
ORDER BY total desc
中选择任何列