SQL-使用计算列过滤计算列

时间:2018-06-24 20:35:42

标签: sql-server tsql

我正在尝试在数据库中找出剂量最大的患者。必须计算出剂量的总和,然后我必须动态列出已经接受过如此剂量的患者。查询必须是动态的,并且列出的患者可能超过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

数据库如下:

enter image description here

主要问题是:如何在需要将计算列与动态计算值列表进行比较的地方使用where / having子句?

我正在使用Microsoft的SQL Server2012。需要在子查询中使用DISTINCT,以便仅显示前5个剂量(例如, DISTINCT,我得到{{ 1}} 7,6,5,4,3一起获得DISTINCT,我的目标是第一个)。

1 个答案:

答案 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 中选择任何列