[pgsql-jp: 30563] Re: 縦のデータを横に出力するSQL文
WADA Hiroyuki
wada @ komine-ag.co.jp
2003年 7月 23日 (水) 21:27:51 JST
和田です。
Takao Kato wrote:
>
> 加藤@川崎です。
> ですが、GROUP BYとSUMを組み合わせたSQLが実現可能なのだから、次のような
> PL/PGSQLも大丈夫だろうと検討したのですが、夢半ば断念してしまいました。
>
> GROUP BYしたときあるカラムの値をリスト(配列)にする LISTS 関数
>
> => SELECT key,LISTS(id) as ids FROM test GROUP BY key;
> key | ids
> -----+---------
> a | {1,2,3}
> b | {4,5}
> (以上、実行イメージ)
こんなのでできました。
create function int4_list_accum(text,int4) returns text as '
DECLARE
list ALIAS FOR $1;
val ALIAS FOR $2;
BEGIN
IF list IS NULL THEN
RETURN val;
ELSIF val IS NULL THEN
RETURN list;
ELSE
RETURN list || '','' || val;
END IF;
END;
'LANGUAGE 'plpgsql';
create function int4_list(text) returns int4[] as '
DECLARE
list ALIAS FOR $1;
BEGIN
RETURN ''{'' || list || ''}'';
END;
'LANGUAGE 'plpgsql';
create aggregate int4_list(
basetype = int4,
sfunc = int4_list_accum,
stype = text,
finalfunc = int4_list);
しかし、配列の中身がソートされてないなあ、と思ってcontribを
見たら、int_aggregateというのがありました(^^;
これもソートされませんが、ソートにはintarrayが使えます。
pgsql-jp メーリングリストの案内