복붙노트

[SQL] 각 그룹에 대해 특정 열에서 모든 문자열을 연결하는 방법

SQL

각 그룹에 대해 특정 열에서 모든 문자열을 연결하는 방법

나는이 테이블이 있다고 가정 [표 1]

Name    Mark
------- ------
ABC     10
DEF     10
GHI     10
JKL     20
MNO     20
PQR     30

어떤 레코드를 검색하는 내 SQL 문을해야한다고 다음과 같다 : ([표]에 의해 기). 나는 1, 2 열을 수행했지만 세 번째 열 수행하는 방법을 모르는 (같은 [표시]와 [이름] CONCAT를)

mark count     names
---- -----     -----------
10       3     ABC,DEF,GHI
20       2     JKL,MNO
30       1     PQR

나는 마이크로 소프트 SQL을 사용하고 있습니다. 도와주세요. 감사

해결법

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

    1.MS SQL 2005 이상합니다.

    MS SQL 2005 이상합니다.

    declare @t table([name] varchar(max), mark int)
    
    insert @t values ('ABC', 10), ('DEF', 10), ('GHI', 10),
        ('JKL', 20), ('MNO', 20), ('PQR', 30)
    
    
    select t.mark, COUNT(*) [count]
        ,STUFF((
            select ',' + [name]
            from @t t1
            where t1.mark = t.mark
            for xml path(''), type
        ).value('.', 'varchar(max)'), 1, 1, '') [values]
    from @t t
    group by t.mark
    

    산출:

    mark        count       values
    ----------- ----------- --------------
    10          3           ABC,DEF,GHI
    20          2           JKL,MNO
    30          1           PQR
    
  2. ==============================

    2.여기에 성능 관련 답변입니다!

    여기에 성능 관련 답변입니다!

    http://jerrytech.blogspot.com/2010/04/tsql-concatenate-strings-1-2-3-and.html

    큰 쿼리에서 XML 기능을 사용하면 성능 살인자입니다.

    CTE를 사용하면 성능 슈퍼 스타이다.

    링크를 확인,이 방법을 설명 할 것이다.

    나는 그것이 더 달성하기 위해 일을 인정한다.

    그러나 결과는 수백만 개의 행 이상 밀리 초입니다.

  3. ==============================

    3.polishchuks 솔루션은 더 우아하다, 그러나 이것은 기본적으로 같은 것, 우리가 다르게 콤마 처리합니다.

    polishchuks 솔루션은 더 우아하다, 그러나 이것은 기본적으로 같은 것, 우리가 다르게 콤마 처리합니다.

    CREATE TABLE #Marks(Name nchar(3), Mark int)
    
    INSERT INTO #Marks
    
    SELECT 'ABC', 10 UNION ALL
    SELECT 'DEF', 10 UNION ALL
    SELECT 'GHI', 10 UNION ALL
    SELECT 'JKL', 20 UNION ALL
    SELECT 'MNO', 20 UNION ALL
    SELECT 'PQR', 30 
    
    
    SELECT 
        mark,  
        [count],
        CASE WHEN Len(Names) > 0 THEN LEFT(Names, LEN(Names) -1) ELSE '' END names  
        FROM
    (
    SELECT
        Mark,
        COUNT(Mark) AS [count], 
            (
            SELECT DISTINCT 
                Name + ', '
            FROM 
                #Marks M1
            WHERE M1.Mark = M2.Mark
            FOR XML PATH('')    
            ) Names 
    FROM #Marks M2
    GROUP BY Mark
    ) M
    
  4. ==============================

    4.T-SQL 프로그래밍, P : 느슨하게 Itzik 벤 웨이 코 뮤니시, 내부 마이크로 소프트 SQL 서버 2005을 기반으로. 215 :

    T-SQL 프로그래밍, P : 느슨하게 Itzik 벤 웨이 코 뮤니시, 내부 마이크로 소프트 SQL 서버 2005을 기반으로. 215 :

    IF OBJECT_ID('dbo.Table1') IS NOT NULL 
        DROP TABLE dbo.Table1 ;
    GO
    CREATE TABLE dbo.Table1 ( Name VARCHAR(10), Mark INT ) ;
    
    INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'ABC',     10 ) ;
    INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'DEF',     10 ) ;
    INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'GHI',     10 ) ;
    INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'JKL',     20 ) ;
    INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'MNO',     20 ) ;
    INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'PQR',     30 ) ;
    
    
    WITH DelimitedNames AS
    (
        SELECT Mark, T2.Count,
            (   SELECT Name + ',' AS [text()]
                FROM dbo.Table1 AS T1
                WHERE T1.Mark = T2.Mark
                ORDER BY T1.Mark
                FOR XML PATH('')) AS Names
        FROM ( SELECT Mark, COUNT(*) AS Count FROM dbo.Table1 GROUP BY Mark ) AS T2 
    )
    SELECT Mark, Count, LEFT(Names, LEN(NAMES) - 1) AS Names
    FROM DelimitedNames ;
    
  5. from https://stackoverflow.com/questions/6579440/how-to-concatenate-all-strings-from-a-certain-column-for-each-group by cc-by-sa and MIT license