SQL - 计算多列中的出现次数
Posted
技术标签:
【中文标题】SQL - 计算多列中的出现次数【英文标题】:SQL - Count occurrences across multiple columns 【发布时间】:2014-06-29 16:21:09 【问题描述】:我有一个假设的数据库,其中包含患者及其合并症(或通常称为诊断代码):
PATIENT_ID | HOSPITAL | DIAG_01 | DIAG_02 | DIAG_03 | DIAG_04 ...up to Diag_14
Patient 1 | Hosp1 | C01 | C02 | NULL | NULL
Patient 2 | Hosp1 | A01 | A02 | A03 | P37
Patient 3 | Hosp2 | A01 | D10 | X01 | NULL
患者的合并症(最多可记录 14 种)定义了患者可能患有的任何疾病/疾病。特别是 C00 - C97 和 D00 - D48 与癌症 ICD-10 代码相关。
我想为每家医院制作一份摘要,计算有多少患者的诊断列中有癌症 ICD-10 代码。
根据上述示例,Hosp1 和 Hosp2 各有 1 名癌症患者。患者 1 的 C01 和 C02 诊断代码将仅计为一名癌症患者。但是,如果患者 1 再次入院,则将被视为另一例癌症患者。
我尝试创建一个包含所有癌症合并症的表,并对所有 14 个诊断列使用 JOIN 查询,但无法进行计数。
任何想法或帮助将不胜感激。
【问题讨论】:
【参考方案1】:全部使用联合
SELECT * FROM /**customize your select here could be count() etc **/
(SELECT PATIENT_ID,HOSPITAL,DIAGNOSIS
FROM (
SELECT PATIENT_ID, HOSPITAL, LEFT(DIAG_01,1) AS DIAGNOSIS FROM table_name WHERE DIAG_01 IS NOT NULL UNION ALL
SELECT PATIENT_ID, HOSPITAL, LEFT(DIAG_02,1) AS DIAGNOSIS FROM table_name WHERE DIAG_02 IS NOT NULL UNION ALL
SELECT PATIENT_ID, HOSPITAL, LEFT(DIAG_03,1) AS DIAGNOSIS FROM table_name WHERE DIAG_03 IS NOT NULL UNION ALL
SELECT PATIENT_ID, HOSPITAL, LEFT(DIAG_04,1) AS DIAGNOSIS FROM table_name WHERE DIAG_04 IS NOT NULL
) AS T1
GROUP BY PATIENT_ID,HOSPITAL,DIAGNOSIS
) AS T2
WHERE DIAGNOSIS IN ('C','D') /**where **/
【讨论】:
【参考方案2】:您的数据布局错误。你应该有一个连接表。但是,你没有。你可以用union all
做你想做的事:
select hospital, count(distinct patient_id)
from ((select patient_id, hospital, diag_01 as diag
from hypothetical
) union all
(select patient_id, hospital, diag_02 as diag
from hypothetical
)
union all
. . .
(select patient_id, hospital, diag_14 as diag
from hypothetical
)
) phd
where diag in ('C01', 'C02');
【讨论】:
这看起来很棒,谢谢!不幸的是,我受到限制,因为这是一个国家数据库,所以在结构方面可以做的不多以上是关于SQL - 计算多列中的出现次数的主要内容,如果未能解决你的问题,请参考以下文章