web-dev-qa-db-ja.com

GROUP_BY句の値のリストを取得するにはどうすればよいですか?

このようなデータがテーブルにある場合

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
28
Jagmal

MySQLには GROUP_CONCAT があり、Sybaseには別の回答で述べられているように [〜#〜] list [〜#〜] があることを知っています。

SELECT id, LIST(data||', ')
FROM yourtable
GROUP BY id
13
lpfavreau

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
5
Eduardo Molteni

プレーンバニラSQLのストレートGROUPBYでこれを行うことはできません。各グループの値を手動で連結するには、カーソル(または同様の構成)を使用する必要があります。

  • Oracleでは、PL/SQLでこの連結を行うカスタム・アグリゲータを定義できます。
  • SQL Serverでは、これを行うカスタムアグリゲーターを.NETで定義することもできます。
  • ただし、Sybaseがカスタムアグリゲータを定義するためにどのようなオプションを持っているかはわかりません。
3
Dave Markle

PL/SQLでは、次の方法で実行できます。

SELECT id, LISTAGG(data, ',') WITHIN GROUP(ORDER BY 0) "data"
  FROM yourtable
 GROUP BY id
3
Yan Pak

PostgreSQLの場合、同様の関数を使用します string_agg

SELECT id, string_agg(data, ',')
FROM yourtable
GROUP BY id
2
Ringtail

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
1
eitan

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
puppylpg
1
Dan Williams

構文を使用してから数年が経ち、iAnywhereインスタンスにアクセスできなくなりましたが、そのようなタスクを実行するための集計関数(リスト)がありました。 LIST()がまだサポートされているかどうかを確認できません。

SELECT id,
       LIST(data)
FROM   table
GROUP BY id
0
KDrewiske

これを試してください:

SELECT id,
       GROUP_CONCAT(data)
FROM   table
GROUP BY id
0
Aziz