string_agg()からの結果をソートする方法


98

テーブルがあります:

CREATE TABLE tblproducts
(
productid integer,
product character varying(20)
)

行で:

INSERT INTO tblproducts(productid, product) VALUES (1, 'CANDID POWDER 50 GM');
INSERT INTO tblproducts(productid, product) VALUES (2, 'SINAREST P SYP 100 ML');
INSERT INTO tblproducts(productid, product) VALUES (3, 'ESOZ D 20 MG CAP');
INSERT INTO tblproducts(productid, product) VALUES (4, 'HHDERM CREAM 10 GM');
INSERT INTO tblproducts(productid, product) VALUES (5, 'CREAM 15 GM');
INSERT INTO tblproducts(productid, product) VALUES (6, 'KZ LOTION 50 ML');
INSERT INTO tblproducts(productid, product) VALUES (7, 'BUDECORT 200 Rotocap');

私が実行するstring_agg()tblproducts

SELECT string_agg(product, ' | ') FROM "tblproducts"

次の結果が返されます。

CANDID POWDER 50 GM | ESOZ D 20 MG CAP | HHDERM CREAM 10 GM | CREAM 15 GM | KZ LOTION 50 ML | BUDECORT 200 Rotocap

集約された文字列を、使用する順にソートするにはどうすればよいORDER BY productですか?

PostgreSQL 9.2.4を使用しています。

回答:


221

postgres 9.0以降では、次のように記述できます。

select string_agg(product,' | ' order by product) from "tblproducts"

詳細はこちら


ウィンドウ関数を使用するときにも機能するソリューションを提案できますか?
Saurabh Gujarani

リンクをありがとう。string_aggドキュメントを検索しても、そこに移動するわけではありません。
Manngo

25

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

SELECT
  STRING_AGG(prod, '|') WITHIN GROUP (ORDER BY product)
FROM ... 

3
質問はPostgreSQLに関するものでした。このWITHIN GROUP句はstring_agg、Microsoft SQLとは異なり、関数には適用されません。
Manngo

5
質問はstring_aggに関するものでした。Postgresは彼の質問に付随的であり、彼はそれを最後に述べました。質問は他の人にも役立ちます。
nomen

1
この構文は、あなたの構文エラーを与えた場合、あなたの互換性レベルを確認してください。stackoverflow.com/questions/43611024/...
ミスターTA

4
select string_agg(prod,' | ') FROM 
  (SELECT product as prod FROM tblproducts ORDER BY product )MAIN;

SQL FIDDLE


2
私はOPと同じ問題があり、このアプローチは最初に考えましたが、残念ながら、Igorはそうですが、うまくいきませんでした。
chbrown 2016

私の側では、両方のアプローチ(IleshとIgorの)が機能しました。
Stephan

2
間違った答え。動作する可能性がありますが、動作が保証されていません。
zyamys 2018年

リレーショナルデータベースは部分的に数学的セットに基づいており、これはSQLの基本原則が行の順序は重要ではないという事実に反映されています。サブクエリにORDER BY句を含めたとしても、FROM句は必ずしもデータを順番に取得するわけではありません。これが機能する場合、それは純粋な運です。
Manngo

1

SQL SERVERの同じソリューションを探していたところ、以下のソリューションが見つかりました

SELECT string_agg(product, ' | ') WITHIN GROUP (ORDER BY product) FROM tblproducts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.