복붙노트

[SQL] SQLSERVER에서 ListAGG

SQL

SQLSERVER에서 ListAGG

나는 SQLServer에있는 'STRING'필드를 집계하기 위해 노력하고있어. 나는 오라클처럼 동일한 기능의 LISTAGG을 발견하고 싶습니다.

당신은 동일한 기능 또는 다른 방법을 수행하는 방법을 알고 계십니까?

예를 들어,

Field A | Field B
1       |  A
1       |  B
2       |  A

그리고 나는이 쿼리의 결과가 될 것이라고 싶습니다

1 | AB
2 | A

해결법

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

    1.SQL 서버 2017 STRING_AGG 기능이 논리를 상당히 단순화로 볼 수 있습니다 년에 시작 :

    SQL 서버 2017 STRING_AGG 기능이 논리를 상당히 단순화로 볼 수 있습니다 년에 시작 :

    select FieldA, string_agg(FieldB, '') as data
    from yourtable
    group by FieldA
    

    데모와 SQL 바이올린을 참조하십시오

    SQL 서버에서 당신은 결과를 얻기 위해 XML 경로 사용할 수 있습니다 :

    select distinct t1.FieldA,
      STUFF((SELECT distinct '' + t2.FieldB
             from yourtable t2
             where t1.FieldA = t2.FieldA
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,0,'') data
    from yourtable t1;
    

    데모와 SQL 바이올린을 참조하십시오

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

    2.

    SELECT FieldA
         , GROUP_CONCAT(FieldB ORDER BY FieldB SEPARATOR ',') AS FieldBs
      FROM TableName
     GROUP BY FieldA
     ORDER BY FieldA;
    
    SELECT FieldA
         , LISTAGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs
      FROM TableName
     GROUP BY FieldA
     ORDER BY FieldA;
    
    SELECT FieldA
         , STRING_AGG(FieldB, ',' ORDER BY FieldB) AS FieldBs
      FROM TableName
     GROUP BY FieldA
     ORDER BY FieldA;
    

    SQL 서버 ≥ 2017 및 푸른 SQL

    SELECT FieldA
         , STRING_AGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs
      FROM TableName
     GROUP BY FieldA
     ORDER BY FieldA;
    

    SQL 서버 ≤ 2,016 (CTE는 DRY 원칙을 장려하기 포함)

      WITH CTE_TableName AS (
           SELECT FieldA, FieldB
             FROM TableName)
    SELECT t0.FieldA
         , STUFF((
           SELECT ',' + t1.FieldB
             FROM CTE_TableName t1
            WHERE t1.FieldA = t0.FieldA
            ORDER BY t1.FieldB
              FOR XML PATH('')), 1, LEN(','), '') AS FieldBs
      FROM CTE_TableName t0
     GROUP BY t0.FieldA
     ORDER BY FieldA;
    

    주문은 CTE 또는 하위 쿼리가 필요합니다

      WITH CTE_TableName AS (
           SELECT FieldA, FieldB
             FROM TableName
            ORDER BY FieldA, FieldB)
    SELECT FieldA
         , GROUP_CONCAT(FieldB, ',') AS FieldBs
      FROM CTE_TableName
     GROUP BY FieldA
     ORDER BY FieldA;
    

    순서없이

    SELECT FieldA
         , GROUP_CONCAT(FieldB, ',') AS FieldBs
      FROM TableName
     GROUP BY FieldA
     ORDER BY FieldA;
    
  3. ==============================

    3.SQL 서버 2017 STRING_AGG이 추가됩니다 :

    SQL 서버 2017 STRING_AGG이 추가됩니다 :

    SELECT t.name,STRING_AGG (c.name, ',') AS csv
    FROM sys.tables t
    JOIN sys.columns c on t.object_id = c.object_id
    GROUP BY t.name
    ORDER BY 1
    

    또한, STRING_SPLIT는 SQL 서버 2016에서 반대의 경우에 유용하고 있습니다

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

    4.이것은 또한 사람에게 유용 할 수 있습니다 ..

    이것은 또한 사람에게 유용 할 수 있습니다 ..

    즉, 데이터 분석의 목적 및 유형 프로파일 데이터 .. (즉. 그룹화하지 않음) 용 ..

    는 SQL * 서버 2017 String_agg 기능이 존재하기 전에 ..

    (즉 단 하나 개의 행을 반환 ..)

    select distinct
    SUBSTRING (
    stuff(( select distinct ',' + [FieldB] from tablename order by 1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
    ,1,0,'' ) 
    ,2,9999)
    from 
        tablename 
    

    예를 들면 리턴 값은 쉼표로 구분 A, B

  5. from https://stackoverflow.com/questions/15477743/listagg-in-sqlserver by cc-by-sa and MIT license