【问题标题】:SQL Group rows for every ID using left outer join使用左外连接的每个 ID 的 SQL 组行
【发布时间】:2017-10-20 18:16:55
【问题描述】:

我有一张表格,其中包含针对 6 种不同疾病(如糖尿病、高血压、心力衰竭等)的近百万条索赔记录。每个成员都有许多索赔。他可能会声称患有糖尿病或高血压或其他任何疾病。我的目标是对每个成员行的条件(索赔数量)进行分组。

现有表

+--------------+---------------+------+------------+
|  Conditions  | ConditionCode |  ID  | Member_Key |
+--------------+---------------+------+------------+
| DM           |          3001 | 1212 | A1528      |
| HTN          |          5001 | 1213 | A1528      |
| COPD         |          6001 | 1214 | A1528      |
| DM           |          3001 | 1215 | A1528      |
| CAD          |          8001 | 1823 | B4354      |
| HTN          |          5001 | 3458 | B4354      |
+--------------+---------------+------+------------+

期望的结果

+------------+------+-----+----+----+-----+-----+
| Member_Key | COPD | CAD | DM | HF | CHF | HTN |
+------------+------+-----+----+----+-----+-----+
| A1528      |    1 |     |  2 |    |     |   1 |
| B4354      |      |   1 |    |    |     |   1 |
+------------+------+-----+----+----+-----+-----+

查询

select distinct tr.Member_Key,C.COPD,D.CAD,DM.DM,HF.HF,CHF.CHF,HTN.HTN
   FROM myTable tr
   --COPD
  left outer join (select Member_Key,'X' as COPD
   FROM myTable
   where Condition=6001) C
  on C.Member_Key=tr.Member_Key
  --CAD
  left outer join ( ....

现在我只使用“X”。但我试图根据条件获得代替 X 的索赔数量。当您搜索 100 万行并执行不同的操作时,我认为使用左外连接效率不高。有没有其他办法解决这个问题

【问题讨论】:

  • 熟悉PIVOT函数。
  • hmmm... PIVOT 似乎不需要这种情况。 @KrzysztofKaszkowiak
  • 你是对的。如果条件数不变,则不需要 PIVOT。

标签: sql sql-server join left-join distinct


【解决方案1】:

您不想要这么多子查询,这很容易使用 group by 和 case 语句:

SELECT Member_Key
       SUM(CASE WHEN Condition=6001 THEN 1 ELSE 0 END) AS COPD,              
       SUM(CASE WHEN Condition=3001 THEN 1 ELSE 0 END) AS DM,
       SUM(CASE WHEN Condition=5001 THEN 1 ELSE 0 END) AS HTN,
       SUM(CASE WHEN Condition=8001 THEN 1 ELSE 0 END) AS CAD
FROM myTable
GROUP BY Member_Key

【讨论】:

    【解决方案2】:

    这是 CASE 语句的理想情况:

    SELECT tr.Member_Key, 
        SUM(CASE WHEN Condition=6001 THEN 1 ELSE 0 END) as COPD,
        SUM(CASE WHEN Condition=6002 THEN 1 ELSE 0 END) as OtherIssue,
        SUM(CASE etc.)
    FROM myTable tr
    GROUP BY tr.Member_Key
    

    【讨论】:

    • 很好的答案——有一些错别字没有定义 tr 别名。
    【解决方案3】:

    这应该通过 PIVOT 来完成,例如:

    SELECT *
    FROM
    (SELECT conditions, member_key
     FROM t) src
     PIVOT
    (COUNT (conditions)
     for conditions in ([COPD], [CAD], [DM], [HF], [CHF], [HTN])) pvt
    

    【讨论】:

    • 看起来条件代码是一个整数。条件是一个字符串
    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多