Cara mengurutkan hasil dari string_agg ()

100

Saya punya meja:

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

Dengan baris:

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');

Jika saya mengeksekusi string_agg()pada tblproducts:

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

Ini akan mengembalikan hasil sebagai berikut:

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

Bagaimana saya bisa mengurutkan string agregat, dalam urutan yang akan saya gunakan ORDER BY product?

Saya menggunakan PostgreSQL 9.2.4.

Vivek S.
sumber

Jawaban:

227

Dengan postgres 9.0+ Anda dapat menulis:

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

Detailnya di sini .

Igor Romanchenko
sumber
bisakah Anda menyarankan solusi yang juga akan berfungsi saat menggunakan fungsi jendela?
Saurabh Gujarani
Terima kasih untuk tautannya. Mencari string_aggdi dokumentasi tidak membawa Anda ke sana.
Manngo
32

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 ... 
Luuk
sumber
4
Pertanyaannya adalah tentang PostgreSQL. The WITHIN GROUPklausul tidak berlaku untuk string_aggfungsi, seperti halnya dengan Microsoft SQL.
Manngo
7
Pertanyaannya adalah tentang string_agg. Postgres adalah kebetulan untuk pertanyaannya dan dia menyebutkannya terakhir. Pertanyaan itu berguna bagi orang lain juga.
nomen
1
Jika sintaks ini memberi Anda kesalahan sintaks, periksa tingkat kompatibilitas Anda: stackoverflow.com/questions/43611024/…
Tn. TA
4
select string_agg(prod,' | ') FROM 
  (SELECT product as prod FROM tblproducts ORDER BY product )MAIN;

SQL FIDDLE

Ilesh Patel
sumber
2
Saya memiliki masalah yang sama dengan OP, dan pendekatan ini adalah pemikiran pertama saya, tetapi sayangnya itu tidak berhasil (yang membawa saya ke sini), sedangkan Igor berhasil.
chbrown
Di sisi saya, kedua pendekatan (Ilesh dan Igor) berhasil.
Stephan
3
Jawaban yang salah. Ini mungkin berhasil tetapi tidak dijamin berhasil.
zyamys
Database Relasional sebagian didasarkan pada himpunan matematika, dan ini tercermin dalam fakta bahwa prinsip dasar dalam SQL adalah bahwa urutan baris tidak signifikan. Meskipun Anda menyertakan ORDER BYklausa dalam sub kueri, FROMklausa tersebut tidak selalu mendapatkan data secara berurutan. Jika ini berhasil, itu murni keberuntungan.
Manngo