Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-使用计算列筛选计算列_Sql Server_Tsql - Fatal编程技术网

Sql server SQL-使用计算列筛选计算列

Sql server SQL-使用计算列筛选计算列,sql-server,tsql,Sql Server,Tsql,我想找出数据库中剂量最多的病人。必须计算出剂量的总和,然后我必须动态列出服用了那么多剂量的患者。查询必须是动态的,可以列出5个以上的患者-例如,5个最大剂量是7,6,5,4,3剂量,但3个人已经服用了5剂量,因此我必须列出总共7个人服用7,6,5,5,4,3剂量的患者。我遇到了一些问题,因为您无法在where子句中引用命名列,我不知道如何解决这个问题 查询如下所示: SELECT info.NAME, SUM(therapy.DOSE) AS total FROM dbo.P

我想找出数据库中剂量最多的病人。必须计算出剂量的总和,然后我必须动态列出服用了那么多剂量的患者。查询必须是动态的,可以列出5个以上的患者-例如,5个最大剂量是7,6,5,4,3剂量,但3个人已经服用了5剂量,因此我必须列出总共7个人服用7,6,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
数据库如下所示:

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 Server 2012。子查询中需要DISTINCT,以便只显示前5个剂量,例如,没有DISTINCT,我得到7,6,5,4,3,DISTINCT,我得到7,6,6,5,4,我的目标是第一个。大多数DBMS支持标准SQL分析函数,如稠密等级:


顺便说一句,您可能不需要左连接,因为您没有从dbo.FORMULARY\u CLINICAL中选择任何列?它支持稠密等级吗?请标记您的数据库管理系统。至于你的问题,我想这部分是问题选择不同,因此需要删除不同,以便列出所有剂量,然后,在主选择中,你可以使用不同,这种方式将包括有5个剂量部分的患者。我想你可能误解了这个问题。带有DISTINCT的内部查询只返回整个数据库中前5个最高总剂量。我需要找到获得前5个最高总剂量的所有患者。这给了我多个错误-ORDER BY列表中的位置1遇到了一个常量表达式,并且在最后一个from语句中遇到了无效对象nam cte。我将ORDER BY复制到cte中,将其删除。谢谢@dnoeth。这对我来说很好。