복붙노트

[SQL] SQL Server의 CONCAT 그룹 [중복]

SQL

SQL Server의 CONCAT 그룹 [중복]

이 같은 테이블이있는 경우 :

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

어떻게이 같은 결과 집합을 얻을 수 있습니다 :

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

나는이 GROUP_CONCAT를 사용하여 MySQL의에서 할 정말 쉽게 알지만, MSSQL 2005 년에 그것을 할 수 있어야합니다

감사

(SQL Server의 CONCATENATE 문자열에 GROUP BY를 사용하는 방법의 중복?)

해결법

  1. ==============================

    1.깨끗하고 효율적인 솔루션을 위해 당신이 사용자 정의 집계 함수를 만들 수 있습니다, 당신이 필요로 그냥 뭐합니까 심지어 예를 들어이있다. 그런 다음 (표준 쿼리 계획과) 다른 집계 함수처럼 사용할 수 있습니다 :

    깨끗하고 효율적인 솔루션을 위해 당신이 사용자 정의 집계 함수를 만들 수 있습니다, 당신이 필요로 그냥 뭐합니까 심지어 예를 들어이있다. 그런 다음 (표준 쿼리 계획과) 다른 집계 함수처럼 사용할 수 있습니다 :

  2. ==============================

    2.이것은 할 것입니다 :

    이것은 할 것입니다 :

    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
    
  3. ==============================

    3.보다:

    보다:

    http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html

  4. ==============================

    4.종종 여기 물었다.

    종종 여기 물었다.

    가장 효율적인 방법은 FOR의 XML 경로 트릭을 사용하고 있습니다.

  5. ==============================

    5.이것은 단지 하나 개의 가능한 솔루션 나를왔다. 나는 성능에 대해 아무 생각이 없지만, 나는 그것이 문제를 해결하는 흥미로운 방법이 될 거라 생각 했어요. 나는 (내가 널 (NULL)에 대한 계정에 코드를하지 않았다) 간단한 상황에서 작동하는지 테스트했다. 그것을 당신을 위해 잘 수행하는 경우 볼 수있는 테스트를 제공하시기 바랍니다.

    이것은 단지 하나 개의 가능한 솔루션 나를왔다. 나는 성능에 대해 아무 생각이 없지만, 나는 그것이 문제를 해결하는 흥미로운 방법이 될 거라 생각 했어요. 나는 (내가 널 (NULL)에 대한 계정에 코드를하지 않았다) 간단한 상황에서 작동하는지 테스트했다. 그것을 당신을 위해 잘 수행하는 경우 볼 수있는 테스트를 제공하시기 바랍니다.

    내가 아이디 (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
    
  6. from https://stackoverflow.com/questions/941103/concat-groups-in-sql-server by cc-by-sa and MIT license