[SQL] DB2 쉼표 그룹에 의해 출력을 분리
SQLDB2 쉼표 그룹에 의해 출력을 분리
DB2 SQL에 쉼표를위한 기능에서 분리 내장 된 열 값이 있습니까?
예 : 거기 ID와 컬럼하고는 동일한 ID로 3 열을 보유하지만, 세 가지 서로 다른 역할을 가질 경우 데이터의 콤마와 연결되어야한다.
ID | Role
------------
4555 | 2
4555 | 3
4555 | 4
출력은 행별로 다음과 같이한다 :
4555 2,3,4
해결법
-
==============================
1.LISTAGG 기능은 DB2 LUW 9.7의 새로운 기능입니다
LISTAGG 기능은 DB2 LUW 9.7의 새로운 기능입니다
예를 참조하십시오
create table myTable (id int, category int); insert into myTable values (1, 1); insert into myTable values (2, 2); insert into myTable values (5, 1); insert into myTable values (3, 1); insert into myTable values (4, 2);
예 : 그룹화 열의 순서없이 선택
select category, LISTAGG(id, ', ') as ids from myTable group by category;
결과:
CATEGORY IDS --------- ----- 1 1, 5, 3 2 2, 4
예 : 분류 열에 절로 순서로 선택
select category, LISTAGG(id, ', ') WITHIN GROUP(ORDER BY id ASC) as ids from myTable group by category;
결과:
CATEGORY IDS --------- ----- 1 1, 3, 5 2 2, 4
-
==============================
2.나는이 작은 쿼리, 당신은 당신이 원하는 것을 할 수 있다고 생각합니다. 이는 DB2에서의 MySQL의 GROUP_CONCAT의 것과 동일합니다.
나는이 작은 쿼리, 당신은 당신이 원하는 것을 할 수 있다고 생각합니다. 이는 DB2에서의 MySQL의 GROUP_CONCAT의 것과 동일합니다.
SELECT NUM, SUBSTR(xmlserialize(xmlagg(xmltext(CONCAT( ', ',ROLES))) as VARCHAR(1024)), 3) as ROLES FROM mytable GROUP BY NUM;
이 출력됩니다 뭔가 같은 :
NUM ROLES ---- ------------- 1 111, 333, 555 2 222, 444
원래의 결과를 가정하는 것은 그 같은했다 :
NUM ROLES ---- --------- 1 111 2 222 1 333 2 444 1 555
-
==============================
3.당신이 가지고있는 DB2 버전의 따라이를 달성하기 위해 XML 기능을 사용할 수 있습니다.
당신이 가지고있는 DB2 버전의 따라이를 달성하기 위해 XML 기능을 사용할 수 있습니다.
일부 데이터 예제 테이블
create table myTable (id int, category int); insert into myTable values (1, 1); insert into myTable values (2, 2); insert into myTable values (3, 1); insert into myTable values (4, 2); insert into myTable values (5, 1);
XML 함수를 사용하여 집계 결과
select category, xmlserialize(XMLAGG(XMLELEMENT(NAME "x", id) ) as varchar(1000)) as ids from myTable group by category;
결과 :
CATEGORY IDS -------- ------------------------ 1 <x>1</x><x>3</x><x>5</x> 2 <x>2</x><x>4</x>
를 사용하여 더 나은 결과 모양을 만들기 위해 교체
select category, replace( replace( replace( xmlserialize(XMLAGG(XMLELEMENT(NAME "x", id) ) as varchar(1000)) , '</x><x>', ',') , '<x>', '') , '</x>', '') as ids from myTable group by category;
청소 결과
CATEGORY IDS -------- ----- 1 1,3,5 2 2,4
그냥 여기 XMLELEMENT 대신 XMLTEXT를 사용하여 더 나은 솔루션을 보았다.
-
==============================
4.DB2 9.7.5 이후 해당하는 기능이있다 :
DB2 9.7.5 이후 해당하는 기능이있다 :
LISTAGG (COLNAME 세퍼레이터)
자세한 내용은이를 확인 : 쉼표로 구분 된 목록으로 데이터의 행을 켜려면 LISTAGG을 사용하여
-
==============================
5.내 문제는 CSV와 열 (VARCHAR)에 행 필드 (CLOB)를 트랜스 및보고를위한 전치 테이블을 사용하는 것이 었습니다. 보고서 층에 전치하면 보고서를 느리게하기 때문에.
내 문제는 CSV와 열 (VARCHAR)에 행 필드 (CLOB)를 트랜스 및보고를위한 전치 테이블을 사용하는 것이 었습니다. 보고서 층에 전치하면 보고서를 느리게하기 때문에.
이동하는 한 가지 방법은 재귀 SQL을 사용하는 것입니다. 당신은하지만에 대한 많은 기사를 찾을 수는 어렵고 자원 당신의 모든 순환 전치 열을 가입하려는 경우이 소요.
나는 하나의 키 식별자로 단일 전치 열을 저장 다수의 글로벌 임시 테이블을 만들었습니다. 결국, 나는 6 열을 가입 6 개 임시 테이블을했지만, 때문에 제한된 자원 할당에 내가 함께 모든 열을 가져올 수 않네. 나는 3 개 공식 이하로 선택한 후, 난 그냥 10 초 나에게 출력을 준 한 쿼리를 실행했다.
나는 XML2CLOB 기능을 사용하는 방법에 대한 다양한 기사를 발견하고 3 개 가지 방법을 발견했다.
REPLACE(VARCHAR(XML2CLOB(XMLAGG(XMLELEMENT(NAME "A",ALIASNAME.ATTRIBUTENAME)))),'', ',') AS TRANSPOSED_OUTPUT
NVL(TRIM(',' FROM REPLACE(REPLACE(REPLACE(CAST(XML2CLOB(XMLAGG(XMLELEMENT(NAME "E", ALIASNAME.ATTRIBUTENAME))) AS VARCHAR(100)),'',' '),'',','), '', 'Nothing')), 'Nothing') as TRANSPOSED_OUTPUT
RTRIM(REPLACE(REPLACE(REPLACE(VARCHAR(XMLSERIALIZE(XMLAGG(XMLELEMENT(NAME "A",ALIASNAME.ATTRIBUTENAME) ORDER BY ALIASNAME.ATTRIBUTENAME) AS CLOB)), '',','),'',''),'','')) AS TRANSPOSED_OUTPUT
당신이 여기를 호출 한 후 하위 쿼리에서 VARCHAR로 "attributeName와"캐스팅되어 있는지 확인합니다.
-
==============================
6.재귀 CTE 다른 가능성,
재귀 CTE 다른 가능성,
with tablewithrank as ( select id, category, rownumber() over(partition by category order by id) as rangid , (select count(*) from myTable f2 where f1.category=f2.category) nbidbycategory from myTable f1 ), cte (id, category, rangid, nbidbycategory, rangconcat) as ( select id, category, rangid, nbidbycategory, cast(id as varchar(500)) from tablewithrank where rangid=1 union all select f2.id, f2.category, f2.rangid, f2.nbidbycategory, cast(f1.rangconcat as varchar(500)) || ',' || cast(f2.id as varchar(500)) from cte f1 inner join tablewithrank f2 on f1.rangid=f2.rangid -1 and f1.category=f2.category ) select category, rangconcat as IDS from cte where rangid=nbidbycategory
-
==============================
7.이 시도:
이 시도:
SELECT GROUP_CONCAT( field1, field2, field3 ,field4 SEPARATOR ', ')
from https://stackoverflow.com/questions/7188542/db2-comma-separated-output-by-groups by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL을위한 이전에 상응하여 연결 (0) | 2020.03.27 |
---|---|
[SQL] LINQ case 문 (0) | 2020.03.27 |
[SQL] 왜 MySQL은 집계 함수없이 쿼리 "에 의해 그룹을"할 수 있습니까? (0) | 2020.03.27 |
[SQL] 인간화 또는 자연수 혼합 된 단어 및 번호 문자열의 정렬 (0) | 2020.03.27 |
[SQL] MySQL의 - 피연산자 1 열 (들)을 포함해야 (0) | 2020.03.27 |