복붙노트

[SQL] 수 있습니까 쉼표로 구분 한 열에 여러 행? [복제]

SQL

수 있습니까 쉼표로 구분 한 열에 여러 행? [복제]

나는 SQL Server 데이터베이스에이 같은 병합을 시도하고있다 :

[TicketID], [Person]
 T0001       Alice
 T0001       Bob
 T0002       Catherine
 T0002       Doug
 T0003       Elaine

이 속으로 :

[TicketID], [People]
 T0001       Alice, Bob
 T0002       Catherine, Doug
 T0003       Elaine

나는 SQL Server와 Oracle 모두에서이 작업을 수행해야합니다.

나는 여기에서 필요로 정확히 수행 MySQL을위한 함수 GROUP_CONCAT를 발견하지만, MySQL은 여기에 옵션이 아닙니다.

편집 : 테스트 벤치 :

DECLARE @Tickets TABLE (
    [TicketID] char(5) NOT NULL,
    [Person] nvarchar(15) NOT NULL
)

INSERT INTO @Tickets VALUES
    ('T0001', 'Alice'),
    ('T0001', 'Bob'),
    ('T0002', 'Catherine'),
    ('T0002', 'Doug'),
    ('T0003', 'Elaine')

SELECT * FROM @Tickets

해결법

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

    1.여기에 2005 + SQL 서버에서 작동하는 솔루션입니다 :

    여기에 2005 + SQL 서버에서 작동하는 솔루션입니다 :

    SELECT t.TicketID,
           STUFF(ISNULL((SELECT ', ' + x.Person
                    FROM @Tickets x
                   WHERE x.TicketID = t.TicketID
                GROUP BY x.Person
                 FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma],
           ISNULL((SELECT ', ' + x.Person
                    FROM @Tickets x
                   WHERE x.TicketID = t.TicketID
                GROUP BY x.Person
                 FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty]
      FROM @Tickets t
    GROUP BY t.TicketID
    

    참고:

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

    2.그리고, 완성도에 대한 MySQL 버전 :

    그리고, 완성도에 대한 MySQL 버전 :

    select
        TicketId,
        GROUP_CONCAT(Person ORDER BY Person SEPARATOR ', ') People
    from
        table
    group by
        TicketId
    
  3. ==============================

    3.

    DECLARE @Tickets TABLE (
        [TicketID] char(5) NOT NULL,
        [Person] nvarchar(15) NOT NULL
    )
    INSERT INTO @Tickets VALUES
        ('T0001', 'Alice'),
        ('T0001', 'Bob'),
        ('T0002', 'Catherine'),
        ('T0002', 'Doug'),
        ('T0003', 'Elaine')
    
    SELECT * FROM @Tickets
    
    Select [TicketID],
    STUFF((SELECT ',' + Person FROM @Tickets WHERE (
    TicketID=Result.TicketID) FOR XML PATH ('')),1,1,'') AS BATCHNOLIST
    From @Tickets AS Result
    GROUP BY TicketID
    
  4. ==============================

    4.나는 오라클에서이 작업을 수행 할 수있는 방법을 발견했다,하지만, 난 여전히 SQL 서버에서 그것을 할 필요가있다.

    나는 오라클에서이 작업을 수행 할 수있는 방법을 발견했다,하지만, 난 여전히 SQL 서버에서 그것을 할 필요가있다.

    에서 http://technology.amis.nl/blog/6118/oracle-rdbms-11gr2-listagg-new-aggregation-operator-for-creating-comma-delimited-strings (감사 tanging) (ORACLE 11 이상)

    select
        TicketId,
        listagg(Person, ', ') People
    from
        table
    group by
        TicketId
    

    올린 사람 : http://halisway.blogspot.com/2006/08/oracle-groupconcat-updated-again.html

    with
        data
    as
      (
        select
            TicketId,
            Person,
            ROW_NUMBER() over (partition by TicketId order by Person) "rownum",
            COUNT(*) over (partition by TicketId) "count"
        from
            Table
      )
    select
        TicketId,
        LTRIM(sys_connect_by_path(Person,','),',') People
    from
        data
    where
        "rownum" = "count"
    start with
        "rownum" = 1
    connect by
        prior TicketId = TicketId
      and
        prior "rownum" = "rownum" - 1
    order by
        TicketId
    
  5. ==============================

    5.하나의 예

    하나의 예

    SELECT DISTINCT
        t.TicketID,
        STUFF((SELECT ', ', i.Person as [text()]
               FROM @Tickets i 
               WHERE i.TicketID = t.TicketID
               FOR XML PATH ('')), 1, 2, '') as People
    FROM
        @Tickets t
    

    ......... 또는 시도 ..............

    SELECT DISTINCT
        t.TicketID,
        STUFF((SELECT ', ' + i.Person    /* notice this line is different */
               FROM @Tickets i 
               WHERE i.TicketID = t.TicketID
               FOR XML PATH ('')), 1, 2, '') as People
    FROM
        @Tickets t
    

    / * 내 테이블이 사용 및 신용 내 관리자에게 그 돌을 갈 때이 작품! * /

  6. from https://stackoverflow.com/questions/2046037/can-i-comma-delimit-multiple-rows-into-one-column by cc-by-sa and MIT license