Могу я запятая разграничивать несколько строк в один столбец? [дубликат]

Этот вопрос уже имеет ответ здесь:

Я пытаюсь объединить что-то вроде этого в своей базе данных 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.

Я нашел функцию GROUP_CONCAT для MySQL, который делает точно, в чем я нуждаюсь здесь, но 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
68
задан James Z 22 October 2015 в 16:53
поделиться

3 ответа

Вот решение, работающее в 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

, ссылки:

73
ответ дан 24 November 2019 в 14:17
поделиться

и, версия MySQL, для полноты:

select
    TicketId,
    GROUP_CONCAT(Person ORDER BY Person SEPARATOR ', ') People
from
    table
group by
    TicketId
13
ответ дан 24 November 2019 в 14:17
поделиться

Я нашел способ сделать это в Oracle, но мне все равно нужно сделать это на SQL Server.

из http://technology.amis.nl/blog/6118/oracle-rdbms-11gr2-listaggg-new-aggretation-operator-for-creating-comma-deLimited-Strings (спасибо Напрашивая ) (Oracle 11 и up)

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

От: http://halisway.blogspot.com/2006/08/oracle-groupconcat-uppdated-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
10
ответ дан 24 November 2019 в 14:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: