[解決済み] PostgreSQL の 'group by' クエリで、文字列フィールドの文字列を連結する方法は?
質問
group byクエリ内のフィールドの文字列を連結する方法を探しています。例えば、あるテーブルがあるとします。
ID COMPANY_ID EMPLOYEE
1 1 Anna
2 1 Bill
3 2 Carol
4 2 Dave
で、company_idでグループ化して、こんな感じにしたかったんです。
COMPANY_ID EMPLOYEE
1 Anna, Bill
2 Carol, Dave
mySQLには、これを行うための組み込み関数があります。 グループ_コンキャット
解決方法は?
PostgreSQL 9.0以降をご使用ください。
最近のPostgres(2010年以降)は
string_agg(expression, delimiter)
という関数は、質問者が求めていることを正確に実行します。
SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;
また、Postgres 9では、Postgres 9のインストール後に
ORDER BY
節
を任意の集約式で使用することができます。
そうでない場合は、すべての結果を順番に並べるか、未定義の順番で処理しなければなりません。というわけで、こう書けるようになりました。
SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;
PostgreSQL 8.4.x:
PostgreSQL 8.4 (2009年)導入。
集約関数
array_agg(expression)
で、値を配列に集めます。次に
array_to_string()
を使うことで、目的の結果を得ることができます。
SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;
PostgreSQL 8.3.x およびそれ以前のバージョン。
この質問が最初に出されたとき、文字列を連結するための組み込みの集約関数はありませんでした。最も単純なカスタム実装 (
このメーリングリストの投稿でVajda Gaboが提案した
を使用することです。
textcat
関数 (これは
||
演算子)を使用します。
CREATE AGGREGATE textcat_all(
basetype = text,
sfunc = textcat,
stype = text,
initcond = ''
);
以下は
CREATE AGGREGATE
のドキュメントをご覧ください。
これは単純にすべての文字列をセパレータなしでくっつけているだけです。最後に ", " を入れずに間に挟むには、自分で連結関数を作って、上の "textcat" の代わりにするとよいかもしれません。以下は、私が8.3.12でテストしたものです。
CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;
このバージョンでは、行の値がNULLや空でもカンマを出力するので、次のような出力になります。
a, b, c, , e, , g
余分なカンマを削除して出力する場合は、このようにします。
a, b, c, e, g
次に
ELSIF
のようにチェックを入れてください。
CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSIF instr IS NULL OR instr = '' THEN
RETURN acc;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;
関連
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] PostgreSQL コマンドラインユーティリティ: psql を終了する方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] pandas GroupByを使ってグループごとの統計情報(カウント、平均値など)を取得する?
-
[解決済み] MySql でクエリ実行時に only_full_group_by に関連するエラーが発生する。
-
[解決済み] Microsoft SQL Server 2005でgroup_concat MySQL関数をシミュレートする?
-
[解決済み】PostgresqlのGROUP_CONCATと同等?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
executeQuery()ソリューションでデータ操作文を発行できない。
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] アドホッククエリとは何ですか?
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] "ON UPDATE CASCADE "を使用する場合について
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み] 1つのカラムの複数の結果行を1つにまとめ、別のカラムでグループ化する[重複]。