source

SQLSERVER에 AGG 나열

ittop 2023. 6. 1. 22:56
반응형

SQLSERVER에 AGG 나열

SQL Server에서 'STRING' 필드를 집계하려고 합니다.저는 오라클과 같은 LISTAGG 기능을 찾고 싶습니다.

당신은 같은 기능이나 다른 방법을 할 줄 압니까?

예를들면,

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

그리고 저는 이 질문의 결과가

1 | AB
2 | A

MySQL

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

오라클 및 DB2

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

PostgreSQl

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

SQL 서버

SQL Server » 2017 및 Azure SQL

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

SQL Server ≤ 2016(DRY 원칙을 장려하기 위해 CTE 포함)

  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;

SQLite

주문에는 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;

SQL Server 2017부터 시작하여STRING_AGG논리를 상당히 단순화하는 기능을 사용할 수 있습니다.

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

SQL Fiddle데모 참조

SQL Server에서 사용할 수 있습니다.FOR XML PATH결과를 얻기 위해:

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 Fiddle데모 참조

SQL Server 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 Server 2016에서 사용할 수 있습니다.

이 기능은 데이터 분석 및 데이터 프로파일링 목적에 유용할 수도 있습니다.(즉, 기준으로 그룹화되지 않음).

SQL Server 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")을 반환합니다.

언급URL : https://stackoverflow.com/questions/15477743/listagg-in-sqlserver

반응형