我有一张诊断和病人的表格。该表每次诊断有一行,患者ID和诊断。
例如
Patient ID | Diagnosis
-----------|----------
0 | Asthma
1 | Hypertension
1 | Asthma
2 | Asthma
2 | Hypertension
2 | Cancer
3 | Asthma
我想按照
的方式输出内容Asthma | 4
Hypertension | 2
Asthma & Hypertension | 2
Asthma, Hypertension and Cancer | 1
如何使用诊断名称计算诊断组合的数量?
即。 x患者有哮喘,x患者有哮喘和高血压,x患者有糖尿病,心脏病,肺病,癌症等。
有些患者有多达12个诊断。提前谢谢!
答案 0 :(得分:1)
这可能需要在使用FOR XML
来连接行时使用比我更精通的人进行编辑,但这是一种方法:
WITH CTE AS (
SELECT
PatientID,
STUFF(
(
SELECT ', ' + [Diagnosis]
FROM Table
WHERE (PatientID = B.PatientID)
ORDER BY Diagnosis
FOR XML PATH('')
)
,1,1,'') AS Diagnoses
FROM Table B
)
SELECT Diagnoses,COUNT(DISTINCT PatientID) as Total
FROM CTE
GROUP BY Diagnoses
基本上,在按诊断排序之后,您为每个患者的所有诊断创建了连锁值(因此'Condition1,Condition2'
与'Condition2,Condition1'
的读取不同),然后创建第二个查询以获取每个组合的计数
答案 1 :(得分:0)
如果我理解正确,您可以使用递归查询执行此操作:
with recursive all_diags as (
select patient_id, diagnosis, diagnosis as diagnosis_list
from diagnostics
union all
select c.patient_id, c.diagnosis, p.diagnosis_list||','||c.diagnosis
from diagnostics c
join all_diags p on p.patient_id = c.patient_id and p.diagnosis < c.diagnosis
)
select diagnosis_list, count(*)
from all_diags
group by diagnosis_list
order by diagnosis_list;
请注意,SQL标准需要关键字recursive
,但并非所有DBMS实际上都支持使用该关键字。
虽然您的预期输出存在差异:我的解决方案还会返回您未在示例输出中包含的Cancer
,Cancer,Hypertension
和Asthma,Cancer
组合。
这是一个SQLFiddle示例:http://sqlfiddle.com/#!15/21087/1