[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 メーリングリストの案内