У меня есть таблица с почти миллионами записей о 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 |
+------------+------+-----+----+----+-----+-----+

< Сильный > Query

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 в зависимости от состояния. Я не думаю, что использование левого внешнего соединения эффективно, когда вы ищете миллион строк и делаете разные. У вас есть какой-то другой подход к решению этой проблемы?

0
shockwave 20 Окт 2017 в 21:16

3 ответа

Лучший ответ

Вам не нужно так много подзапросов, это легко сделать с помощью операторов 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
4
Hogan 20 Окт 2017 в 18:22

Это должно быть сделано с PIVOT, как:

SELECT *
FROM
(SELECT conditions, member_key
 FROM t) src
 PIVOT
(COUNT (conditions)
 for conditions in ([COPD], [CAD], [DM], [HF], [CHF], [HTN])) pvt
0
kjmerf 20 Окт 2017 в 18:36

Это идеальная ситуация для заявлений 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
2
indiri 20 Окт 2017 в 20:32