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 - 计算多列中的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

SQL 计算一列中的出现次数并计算另一列的总数

如何计算 SQL 中的所有组合出现次数?

SQL:计算输出列上出现的次数并根据出现次数计算一些百分比

SQL:计算唯一出现的次数?

Excel:如何计算多列单元格的组合?

计算一个值在 Hive/SQL 中连续出现的次数