【问题标题】:How to concatenate columns from different rows using Group By如何使用 Group By 连接来自不同行的列
【发布时间】:2014-05-23 18:41:28
【问题描述】:

我正在尝试将 3 个不同行中的 3 列连接成一个按 ID 分组的行

ID  Col1    Col2    Col3
5   NULL    Test2   NULL
5   Test1   NULL    NULL
5   NULL    NULL    Test3

把它变成

ID  FinalColumn
5   Test1, Test2, Test3

谢谢!!!

附言值不必按任何特定顺序排列。结果也可以是Test2,Test3,Test1

【问题讨论】:

    标签: sql tsql sql-server-2012


    【解决方案1】:
    SELECT ID, ISNULL(MAX(Col1),'') +','+ ISNULL(MAX(Col2),'') +','+ ISNULL(MAX(Col3),'') AS FinalColumn
    FROM tbl
    GROUP BY ID
    

    编辑:更新以说明任何(或所有)字段中NULL 值的潜力:我可能想多了,但它可能会有所帮助。下面的代码示例与我的想法,如果您知道您没有 NULL,请随时忽略。

    DECLARE @tbl TABLE (ID INT IDENTITY(1,1), Col1 VARCHAR(20), Col2 VARCHAR(20), Col3 VARCHAR(20))
    INSERT @tbl --(Col1, Col2, Col3)
    values 
    (NULL, NULL, NULL),
    (NULL, '2', '3'),
    ('1', '2', '3'),
    ('4', '5', NULL),
    ('1', NULL, NULL);
    
    SELECT  
        ID, 
        LEFT(
            ISNULL(MAX(Col1 + ','),'') + ISNULL(MAX(Col2 +','),'')+ ISNULL(MAX(Col3 + ','),''), 
            ISNULL(NULLIF(LEN(ISNULL(MAX(Col1 + ','),'') + ISNULL(MAX(Col2 +','),'')+ ISNULL(MAX(Col3 + ','),'')),0),1) -1
            ) AS FinalColumn
    FROM @tbl
    GROUP BY ID
    

    【讨论】:

    • 已更新查询以更正 GROUP BY 中的错误,您可以再试一次吗?
    • 如果这些值中的任何一个为 ALL null,则将 null 连接到字符串会得到 null。
    • 感谢您指出这一点,@paqogomez。我添加了 ISNULL()。
    • 再次编辑,我接受的建议编辑实际上改变了连接字符串。
    • 一定是这样,@paqogomez。谢谢您的帮助! ssokol91,添加了一些额外的 NULL 处理逻辑,以解决 paqogomez 指出的潜在问题。如果您认为您可能会在一列或多列中返回 NULL 值,请使用它:基本上,它会将逗号值移动为仅在它们之前的值为 NULL 时才添加。 LEFT() 函数删除字符串中的最后一个逗号(以防 Col3 返回 NULL)。
    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多