这个问题已经有一个答案在这里:

如果我有一个表这样的:

+------------+
| Id | Value |
+------------+
| 1  | 'A'   |
|------------|
| 1  | 'B'   |
|------------|
| 2  | 'C'   |
+------------+

我怎么能得到一个结果是这样的:

+------------+
| Id | Value |
+------------+
| 1  | 'AB'  |
|------------|
| 2  | 'C'   |
+------------+

我知道这是真的很容易做到在MySQL使用GROUP_CONCAT,但我需要能够做到这一点在2005年MSSQL

感谢

(重复的 如何使用集团通过来串连串SQL服务器?)

有帮助吗?

解决方案

对于清洁和高效的解决方案,您可以创建 一个用户自定义功能集合体, ,甚至还有 一个例子 这不正是你所需要的。
然后你可以用它像任何其他综合功能(用的标准查询计划):

query plan

其他提示

这将做到:

SELECT mt.ID,
       SUBSTRING((SELECT mt2.Value
                  FROM   MyTable AS mt2
                  WHERE  mt2.ID = mt.ID
                  ORDER BY mt2.VALUE
                  FOR XML PATH('')), 3, 2000) AS JoinedValue
FROM   MyTable AS mt

经常 问这里.

最有效的方法是使用XML路伎俩。

这是我作为一个可能的解决方案。我没有想法的表现,但我认为这将是一个有趣的方式来解决问题。我测试,它可以在一个简单的情况(我没有代码帐户Null).随时给它一个测试来看如果它运行良好的你。

表,我用的包括一个id(my_id).那真的可以被任何列为独特的集团内(grp_id),所以它可能是一个日期列或什么的。

;WITH CTE AS (
    SELECT
        T1.my_id,
        T1.grp_id,
        CAST(T1.my_str AS VARCHAR) AS my_str
    FROM
        dbo.Test_Group_Concat T1
    WHERE NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T2 WHERE T2.grp_id = T1.grp_id AND T2.my_id < T1.my_id)
    UNION ALL
    SELECT
        T3.my_id,
        T3.grp_id,
        CAST(CTE.my_str + T3.my_str AS VARCHAR)
    FROM
        CTE
    INNER JOIN dbo.Test_Group_Concat T3 ON
        T3.grp_id = CTE.grp_id AND
        T3.my_id > CTE.my_id
    WHERE
        NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T4 WHERE
        T4.grp_id = CTE.grp_id AND
        T4.my_id > CTE.my_id AND
        T4.my_id < T3.my_id)
)
SELECT
    CTE.grp_id,
    CTE.my_str
FROM
    CTE
INNER JOIN (SELECT grp_id, MAX(my_id) AS my_id FROM CTE GROUP BY grp_id) SQ ON
    SQ.grp_id = CTE.grp_id AND
    SQ.my_id = CTE.my_id
ORDER BY
    CTE.grp_id
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top