SQL - 计算每个可能的组合

时间:2015-08-17 15:28:39

标签: sql

我有一张诊断和病人的表格。该表每次诊断有一行,患者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个诊断。提前谢谢!

2 个答案:

答案 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实际上都支持使用该关键字。

虽然您的预期输出存在差异:我的解决方案还会返回您未在示例输出中包含的CancerCancer,HypertensionAsthma,Cancer组合。

这是一个SQLFiddle示例:http://sqlfiddle.com/#!15/21087/1