Come ordinare il risultato da string_agg ()


98

Ho un tavolo:

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

Con le righe:

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

Se eseguo string_agg()su tblproducts:

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

Restituirà il seguente risultato:

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

Come posso ordinare la stringa aggregata, nell'ordine che vorrei utilizzare ORDER BY product?

Sto usando PostgreSQL 9.2.4.

Risposte:


221

Con postgres 9.0+ puoi scrivere:

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

Dettagli qui .


potete suggerirmi una soluzione che funzioni anche quando usate le funzioni della finestra?
Saurabh Gujarani

Grazie per il collegamento. La ricerca string_aggnella documentazione non ti porta lì.
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
La domanda riguardava PostgreSQL. La WITHIN GROUPclausola non si applica alla string_aggfunzione, come avviene con Microsoft SQL.
Manngo

5
La domanda riguardava string_agg. Postgres era incidentale alla sua domanda e ne ha parlato per ultimo. La domanda è utile anche agli altri.
nomen

1
Se questa sintassi ti dà errori di sintassi, controlla il tuo livello di compatibilità: stackoverflow.com/questions/43611024/…
Mr. TA

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

SQL FIDDLE


2
Ho avuto lo stesso problema di OP, e questo approccio è stato il mio primo pensiero, ma sfortunatamente non funziona (cosa che mi ha portato qui), mentre quello di Igor sì.
chbrown

Da parte mia, entrambi gli approcci (quello di Ilesh e quello di Igor) hanno funzionato.
Stephan

2
Risposta sbagliata. Potrebbe funzionare ma non è garantito che funzioni.
zyamys

Il database relazionale si basa in parte su insiemi matematici e ciò si riflette nel fatto che un principio di base in SQL è che l'ordine delle righe non è significativo. Anche se dovessi includere una ORDER BYclausola nella sottoquery, la FROMclausola non riporta necessariamente i dati in ordine. Se funziona, è pura fortuna.
Manngo

1

Stavo cercando la stessa soluzione per SQL SERVER e ho trovato la soluzione di seguito

SELECT string_agg(product, ' | ') WITHIN GROUP (ORDER BY product) FROM tblproducts
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.