IT

여러 행을 하나의 열로 쉼표로 구분할 수 있습니까?

itgroup 2023. 6. 27. 22:04
반응형

여러 행을 하나의 열로 쉼표로 구분할 수 있습니까?

SQL Server 데이터베이스에서 다음과 같은 것을 병합하려고 합니다.

[티켓 ID], [사용자]T0001 앨리스T0001 밥T0002 캐서린T0002 더그T0003 일레인

대상:

[티켓 ID], [사람]T0001 앨리스, 밥T0002 캐서린, 더그T0003 일레인

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

함수를 찾았습니다.GROUP_CONCATMySQL은 여기서 필요한 것을 정확히 수행하지만 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

다음은 SQL Server 2005+에서 작동하는 솔루션입니다.

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

참조:

그리고 MySQL 버전은 완전성을 위해 다음과 같습니다.

select
    TicketId,
    GROUP_CONCAT(Person ORDER BY Person SEPARATOR ', ') People
from
    table
group by
    TicketId
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

Oracle에서 이 작업을 수행하는 방법을 찾았지만 SQL Server에서 이 작업을 수행해야 합니다.

http://technology.amis.nl/blog/6118/oracle-rdbms-11gr2-listagg-new-aggregation-operator-for-creating-comma-delimited-strings 에서 (땡스탱징) (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

하나의 예

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

이것은 내가 이것을 내 테이블에 사용했을 때 효과가 있고 신용은 내 매니저에게 돌아옵니다!*/

언급URL : https://stackoverflow.com/questions/2046037/can-i-comma-delimit-multiple-rows-into-one-column

반응형