[SQL] SQLSERVER에서 ListAGG
SQLSQLSERVER에서 ListAGG
나는 SQLServer에있는 'STRING'필드를 집계하기 위해 노력하고있어. 나는 오라클처럼 동일한 기능의 LISTAGG을 발견하고 싶습니다.
당신은 동일한 기능 또는 다른 방법을 수행하는 방법을 알고 계십니까?
예를 들어,
Field A | Field B
1 | A
1 | B
2 | A
그리고 나는이 쿼리의 결과가 될 것이라고 싶습니다
1 | AB
2 | A
해결법
-
==============================
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.
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.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.이것은 또한 사람에게 유용 할 수 있습니다 ..
이것은 또한 사람에게 유용 할 수 있습니다 ..
즉, 데이터 분석의 목적 및 유형 프로파일 데이터 .. (즉. 그룹화하지 않음) 용 ..
는 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
from https://stackoverflow.com/questions/15477743/listagg-in-sqlserver by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 당신은 FROM 절에 업데이트를 목표 테이블을 지정할 수 없습니다 (0) | 2020.03.08 |
---|---|
[SQL] SQL은 가입 : 사용 ON 또는 WHERE 사이에 차이가? (0) | 2020.03.08 |
[SQL] 언제 오라클 SQL에 슬래시 대 세미콜론을 사용해야합니까? (0) | 2020.03.08 |
[SQL] SQL은 TABLEA FROM [COLUMNA 제외] SELECT *를 이용하여 열을 제외? (0) | 2020.03.08 |
[SQL] SQL 서버에서 날짜의 제거 시간 부분에 가장 좋은 방법 (0) | 2020.03.08 |