View Full Version : [SQL] Passaggio da una colonna ad un singolo valore
amedeoviscido
09-01-2009, 17:58
Ciao raga,
avrei un problema che non riesco a risolvere, magari sarò un pò arrugginito... il problema è questo: devo impacchettare un'intera colonna in un unico valore. Mi spiego meglio.
Supponiamo che il risultato della query sia la seguente colonna:
column 1
Cellulare
Televisione
Automobile
Io vorrei avere questo risultato:
column 1
Cellulare Televisione Automobile
Ovvero prendere i 3 risultati ed inserirli in un'unica "cella".
Fatemi sapere come procedereste... il numero di risultati può variare, attualmente da zero a 5.
In SQL standard non si puo'.
Sotto MySql c'e' una funzione precostruita chiamata GROUP_CONCAT, che "forse" fa al caso tuo.
Sotto SqlServer e sotto Oracle si puo' fare una funzione di gruppo Custom, per poter fare quello che chiedi.
CozzaAmara
09-01-2009, 20:05
In MySQL puoi usare CONCAT.
SELECT CONCAT(campo1,campo2,campo3 ... ) FROM tabella ...
amedeoviscido
09-01-2009, 20:18
In SQL standard non si puo'.
Sotto MySql c'e' una funzione precostruita chiamata GROUP_CONCAT, che "forse" fa al caso tuo.
Sotto SqlServer e sotto Oracle si puo' fare una funzione di gruppo Custom, per poter fare quello che chiedi.
Uso PostgreSQL, vedo se c'è qualcosa di simile. Volendo potrei usare una stored procedure con un loop, ma volevo qualcosa di più veloce, deve caricare parecchi dati :(
In MySQL puoi usare CONCAT.
SELECT CONCAT(campo1,campo2,campo3 ... ) FROM tabella ...
Così non risolverei, il problema è che non sono campi separati sulla stessa riga, ma lo stesso campo su righe diverse, è una cosa differente. Se volevo fare così potevo usare la concatenazione di PostgreSQL: campo1 || ' ' || campo2 || ' ' || campo3 || ' ' || ...
amedeoviscido
10-01-2009, 13:50
Mi sono informato e quindi vi confermo che è possibile creare funzioni di aggregazione (come count o sum, per intenderci) personalizzate anche con PostgreSQL: direi che il problema è, quindi, risolvibile.
--- EDIT ---
Ecco, a mio modesto parere, la magnifica soluzione al problema :)
Codice scroccato da internet.
Vediamo i preparativi.
Col primo passo creiamo la funzione aggregata array_accum per impacchettare i dati che ci interessano in un array:
CREATE AGGREGATE array_accum (
sfunc = array_append,
basetype = anyelement,
stype = anyarray,
initcond = '{}'
);
Adesso per provare l'efficacia del codice, proviamo a creare una tabella coi miei dati:
CREATE TABLE test (
tipologia varchar(100) primary key
);
INSERT INTO test VALUES ('Cellulare');
INSERT INTO test VALUES ('Televisione');
INSERT INTO test VALUES ('Automobile');
Ecco cosa succede se faccio una select dalla tabella test:
SELECT * FROM test
"Cellulare"
"Televisione"
"Automobile"
Vai con l'array_accum :)
SELECT array_accum(tipologia) FROM test
"{Cellulare,Televisione,Automobile}"
Adesso converto in stringa il risultato...
SELECT array_to_string(array_accum(tipologia), ' ') FROM test
"Cellulare Televisione Automobile"
Spero vi possa essere utile. Ciaooo
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.