복붙노트

[SQL] DB2 쉼표 그룹에 의해 출력을 분리

SQL

DB2 쉼표 그룹에 의해 출력을 분리

DB2 SQL에 쉼표를위한 기능에서 분리 내장 된 열 값이 있습니까?

예 : 거기 ID와 컬럼하고는 동일한 ID로 3 열을 보유하지만, 세 가지 서로 다른 역할을 가질 경우 데이터의 콤마와 연결되어야한다.

ID   | Role
------------
4555 | 2
4555 | 3
4555 | 4

출력은 행별로 다음과 같이한다 :

4555 2,3,4

해결법

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

    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. ==============================

    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. ==============================

    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. ==============================

    4.DB2 9.7.5 이후 해당하는 기능이있다 :

    DB2 9.7.5 이후 해당하는 기능이있다 :

    LISTAGG (COLNAME 세퍼레이터)

    자세한 내용은이를 확인 : 쉼표로 구분 된 목록으로 데이터의 행을 켜려면 LISTAGG을 사용하여

  5. ==============================

    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. ==============================

    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. ==============================

    7.이 시도:

    이 시도:

    SELECT GROUP_CONCAT( field1, field2, field3 ,field4 SEPARATOR ', ')
    
  8. from https://stackoverflow.com/questions/7188542/db2-comma-separated-output-by-groups by cc-by-sa and MIT license