2017-10-20 36 views
0

J'ai une table avec près d'un million de dossiers de réclamations pour 6 conditions différentes comme le diabète, l'hypertension, l'insuffisance cardiaque, etc. Chaque membre a un certain nombre de revendications. Il pourrait avoir des réclamations avec la maladie comme le diabète ou l'hypertension ou toute autre chose. Mon but est de regrouper les conditions qu'ils ont (nombre de réclamations) pour chaque rangée de membres.Lignes SQL Group pour chaque ID utilisant la jointure externe gauche

existing table

+--------------+---------------+------+------------+ 
| 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  | 
+--------------+---------------+------+------------+ 

le résultat souhaité

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

Recherche

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 (.... 

Pour l'instant je suis juste en utilisant 'X'. Mais j'essaye d'obtenir le nombre de réclamations à la place de X basé sur la condition. Je ne pense pas que l'utilisation d'une jointure externe gauche soit efficace lorsque vous recherchez 1 million de lignes et que vous en faites une distincte. Avez-vous une autre approche dans la résolution de cette

+2

se familiariser avec la fonction PIVOT. –

+0

hmmm ... PIVOT ne semble pas nécessaire pour un cas comme celui-ci. @KrzysztofKaszkowiak – Hogan

+0

Vous avez raison. Si le nombre de conditions ne change pas, alors PIVOT est inutile. –

Répondre

4

Vous ne voulez pas tant de sous-requêtes, cela est facile avec le groupe par et déclarations cas:

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

C'est une situation idéale pour statments CAS:

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 
+0

bonne réponse - avoir quelques fautes de frappe là-bas avec le tr alias non défini. – Hogan

0

Cela devrait être fait avec un PIVOT, comme:

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

On dirait que le code de condition est un nombre entier. Conditions est une chaîne – kbball

+0

Vous avez raison! – Hogan