2017-02-23 2 views
0

J'attaché captures d'écran si mon texte ne s'aligne pas: Undesired Results.Comment insérer une colonne de chaînes dans un champ par identifiant unique?

J'ai une table avec une client_id et plusieurs lignes de médicaments. Je veux insérer tous les médicaments par client dans un seul champ délimité par des virgules.

Ma table ressemble à ceci:

=================== 
|Client__ID|DESC | 
|==========|=======| 
|500011 |Plavix | 
|----------|-------| 
|500011 |Zocor | 
|----------|-------| 
|500011 |aspirin| 
|----------|-------| 
|500006 |aspirin| 
|----------|-------| 
|500006 |Plavix | 
|----------|-------| 
|500006 |Zocor | 
|----------|-------| 
=================== 

Ma sortie désirée ressemble à ceci:

======================================== 
|Client__ID|DESC |MEDS_COMB   | 
|==========|=======|====================| 
|500011 |aspirin|Plavix,Zocor,aspirin| 
|----------|-------|--------------------| 
|500006 |aspirin|Plavix,Zocor,aspirin| 
|----------|-------|--------------------| 
======================================== 

Mes résultats réels ressemblent à ceci:

======================================== 
|Client__ID|DESC |MEDS_COMB   | 
|==========|=======|====================| 
|500011 |aspirin|NULL    | 
|----------|-------|--------------------| 
|500006 |aspirin|NULL    | 
|----------|-------|--------------------| 
======================================== 

C'est la requête I 'ai écrit jusqu'ici:

SELECT [CLIENT_ID] 
, [DESC] 
, (STUFF((SELECT CAST(',' + [DESC] AS VARCHAR(MAX)) 
FROM [AZCLMED] 
WHERE (CLIENT_ID = [AZCLMED].CLIENT_ID) AND END_DATE IS NULL 
     FOR XML PATH ('')), 1, 2, '')) AS MEDS_COMB 
FROM [AZCLMED] 
ORDER BY [CLIENT_ID] ASC 

Répondre

0

La syntaxe de votre XML PATH('') est éteinte, ce qui fait partie de votre problème.

Je n'ai pas non plus compris ce que vous voulez faire avec la colonne [Desc].

Obtenir les résultats que vous voulez est aussi facile que cela:

DECLARE @TABLE TABLE (Client__ID INT, [Desc] VARCHAR(55)); 
INSERT INTO @TABLE VALUES (500011, 'Plavix'); 
INSERT INTO @TABLE VALUES (500011, 'Zocor'); 
INSERT INTO @TABLE VALUES (500011, 'Aspirin'); 
INSERT INTO @TABLE VALUES (500006, 'Aspirin'); 
INSERT INTO @TABLE VALUES (500006, 'Plavix'); 
INSERT INTO @TABLE VALUES (500006, 'Zocor'); 

SELECT 
    [CLIENT__ID] 
    ,MIN([DESC]) 
    ,SUBSTRING(
     (
     SELECT ',' + [Desc] 
     FROM @TABLE T2 
     WHERE T2.Client__ID = T1.Client__ID 
     ORDER BY [Desc] 
     FOR XML PATH('') 
     ) 
    ,2,100) AS MEDS_COMB 
FROM @TABLE T1 
GROUP BY T1.Client__ID 
; 

Cependant, je me sens un peu incertain au sujet de la sélection MIN([DESC]), car il semble arbitraire. S'il y a une certaine logique derrière le choix de cette valeur pour cette colonne, veuillez la partager avec moi; Je ne l'ai pas vu dans votre requête d'origine.

+0

Le tableau et les résultats que j'ai publiés n'étaient qu'un exemple des données. Il y a 100 000 enregistrements dans ma table actuelle. Votre requête a bien fonctionné. Comment puis-je l'appliquer à une table beaucoup plus grande? – Chris

+0

La requête doit être identique sur toutes les tables avec les colonnes sélectionnées. Tout ce qui est de 'SUBSTRING (' '' 'MEDS_COMB') est ce qui devrait vous intéresser le plus, semble-t-il: – 3BK

+0

Y a-t-il une logique spéciale à la façon dont vous voulez formulé des lignes? Comme je le disais, le' MIN() 'semble un peu arbitraire Si vous voulez que je donne une réponse plus détaillée que ce que j'ai déjà, je vais avoir besoin d'un peu plus d'informations sur les données réelles que vous avez/veulent: – 3BK