我的SQL Server数据库中有一个表,其中存储了UserID、医疗条件名称和该医疗条件的诊断日期。
UserID ConditionName DiagnosisDate
9038 Hypertension 1971-07-14
9039 Diabetes 1964-05-13每个用户可能有多种健康状况(即,具有UserID 9038的用户可能有头痛、糖尿病和高血压)。
我想写一个查询,找出用户的共病。
例如,我想知道有多少高血压患者同时患有糖尿病。
发布于 2017-08-30 17:50:08
这将显示具有多个医疗条件的所有用户:
SELECT UserID, COUNT(DISTINCT ConditionName) AS medical_conditions
FROM <TABLE>
GROUP BY UserID
HAVING medical_conditions >= 2;如果你想搜索特定的医疗条件,你可以使用IN和子查询:
SELECT UserID
FROM <TABLE>
WHERE ConditionName = 'Diabetes'
AND UserID IN (SELECT UserID FROM <TABLE> WHERE ConditionName = 'Hypertension');发布于 2017-08-30 17:46:55
您可以使用subelect来执行此操作:
SELECT COUNT(*) FROM YourTable
WHERE ConditionName = 'Hypertension'
AND UserID IN
(
SELECT UserID FROM YourTable
WHERE ConditionName = 'Diabetes'
);这将为您提供高血压所有记录的计数。如果一个UserID可能多次出现相同的情况,则必须用COUNT(DISTINCT UserID)替换COUNT(*)。
发布于 2017-08-30 17:46:01
有很多解决方案可以解决这个问题。使用IN
SELECT count(*)
FROM tab
WHERE userid IN (SELECT t2.userid FROM tab t2 WHERE t2.ConditionName = 'Hypertension') and
userid IN (SELECT t2.userid FROM tab t2 WHERE t2.ConditionName = 'Diabetes')使用EXISTS
SELECT count(*)
FROM tab t1
WHERE EXISTS(SELECT 1 FROM tab t2 WHERE t2.ConditionName = 'Hypertension' AND t2.userid = t1.userid) and
EXISTS(SELECT 1 FROM tab t2 WHERE t2.ConditionName = 'Diabetes' AND t2.userid = t1.userid)使用INTERSECT
SELECT count(*)
FROM
(
SELECT userid FROM tab WHERE ConditionName = 'Hypertension'
INTERSECT
SELECT userid FROM tab WHERE ConditionName = 'Diabetes'
) x使用GROUP BY
SELECT userid
FROM tab
WHERE ConditionName = 'Diabetes' or ConditionName = 'Hypertension'
GROUP BY userid
HAVING count(distinct ConditionName) = 2;dbfiddle demo
https://stackoverflow.com/questions/45957010
复制相似问题