Как получить список значений в предложении GROUP_BY? - PullRequest
25 голосов
/ 29 января 2009

Если у меня есть такие данные в таблице

id   data
--   ----
1    1
1    2
1    3
2    4
2    5
3    6
3    4

Как получить такие результаты в запросе (на сервере Sybase)?

id   data
--   ----
1    1, 2, 3
2    4, 5
3    6, 4

Ответы [ 10 ]

12 голосов
/ 30 января 2009

Я знаю, что в MySQL есть GROUP_CONCAT , а в Sybase я думаю, что это LIST , как указано в другом ответе:

SELECT id, LIST(data||', ')
FROM yourtable
GROUP BY id
5 голосов
/ 29 января 2009

В MsSQL вы можете использовать функцию (не знаю, есть ли подобное в SyBase)

CREATE FUNCTION [dbo].[GetDataForID]
(
    @ID int
)
RETURNS varchar(max)
AS
BEGIN
    declare @output varchar(max)
    select @output = COALESCE(@output + ', ', '') + data
    from table
    where ID = @ID

    return @output
END
GO

А потом:

SELECT ID, dbo.GetDataForID(ID) as Data
FROM Table
GROUP BY ID
3 голосов
/ 18 сентября 2017

В PL / SQL вы можете сделать это:

SELECT id, LISTAGG(data, ',') WITHIN GROUP(ORDER BY 0) "data"
  FROM yourtable
 GROUP BY id
2 голосов
/ 27 февраля 2016

Для PostgreSQL используется аналогичная функция string_agg .

SELECT id, string_agg(data, ',')
FROM yourtable
GROUP BY id
2 голосов
/ 29 января 2009

Вы не можете сделать это в прямой GROUP BY в обычном SQL. Вы должны использовать курсор (или аналогичную конструкцию) для объединения значений в каждой группе вручную.

  • Oracle позволяет вам определить собственный агрегатор, который будет выполнять эту конкатенацию в PL / SQL.
  • SQL Server позволяет вам определить собственный агрегатор в .NET, который бы тоже это делал.
  • Я не уверен, какие возможности есть у Sybase для определения пользовательских агрегаторов.
1 голос
/ 10 января 2019

В MySQL используйте

SELECT id, GROUP_CONCAT(data)
 FROM yourtable
 GROUP BY id

или используйте свой собственный разделитель:

SELECT id, GROUP_CONCAT(data SEPARATOR ', ')
 FROM yourtable
 GROUP BY id

см. GROUP_CONCAT .

1 голос
/ 29 января 2009

Я думаю, вам придется использовать курсор (http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/50501;pt=50305)

0 голосов
/ 11 февраля 2019

В SQL Server:

select distinct b.id, data=STUFF((select ',' +convert(varchar,id)
from yourtable a
where a.id=b.id
for xml path ('')),1,1,'')
from yourtable b
0 голосов
/ 26 февраля 2014

Попробуйте это:

SELECT id,
       GROUP_CONCAT(data)
FROM   table
GROUP BY id
0 голосов
/ 29 января 2009

Прошло несколько лет с тех пор, как я пытался использовать синтаксис, и у меня больше нет доступа к экземпляру iAnywhere, но для выполнения такой задачи существовала агрегатная функция (список). Я не могу подтвердить, что LIST () все еще поддерживается.

SELECT id,
       LIST(data)
FROM   table
GROUP BY id
...