【问题标题】:How do I insert a column of strings into one field per unique identifier?如何在每个唯一标识符的一个字段中插入一列字符串?
【发布时间】:2017-07-14 08:24:53
【问题描述】:

如果我的文字不对齐,我会附上屏幕截图:Undesired Results.

我有一张带有 client_id 和多行药物的表格。我想将每位客户的所有药物插入一个逗号分隔的字段中。

我的桌子是这样的:

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

我想要的输出如下所示:

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

我的实际结果是这样的:

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

这是我目前写的查询:

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

【问题讨论】:

    标签: tsql sql-server-2005


    【解决方案1】:

    XML PATH('') 的语法已关闭,这是您的问题的一部分。

    我也不明白你想用[Desc] 列做什么。

    得到你想要的结果就这么简单:

    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
    ;
    

    但是,我对MIN([DESC]) 的选择有点不确定,因为它看起来很随意。如果本栏选择这个值背后有什么逻辑,请分享给我;我在您的原始查询中没有看到它。

    【讨论】:

    • 我发布的表格和结果只是数据的一个示例。我的实际表中有 100,000 条记录。您的查询效果很好。如何将其应用于更大的表?
    • 查询应该在任何具有选定列的表上运行。从SUBSTRING(MEDS_COMB 的所有内容似乎都是您最感兴趣的。
    • 您想如何制定行有一些特殊的逻辑吗?正如我所说,MIN() 对我来说似乎有点武断。如果您希望我给出比我已经拥有的更详细的答案,我将需要更多关于您拥有/想要的实际数据的信息。
    • @Chris,您说,“您的查询效果很好”。您能否接受这个答案而不是放弃答案?当人们互相感谢他们的时间和努力时,StackOverflow 就会起作用。谢谢
    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多