LISTAGG, mette in riga!

Avere dei report chiari e comprensibili è un obiettivo comune. A volte per migliorare un report basta davvero poco, anche una sola funzione: LISTAGG.

LISTAGG: mette in riga i valori. Vediamo come.

Questo articolo si collega ad uno precedente: http://www.fablabway.com/?p=7368

TABELLE E DATI

Creiamo tre tabelle: una per i veicoli, per i proprietari ed una matrice associativa:

CREATE TABLE VEICOLI (
KVEI NUMBER,TARGA VARCHAR2(10), DESCRIZIONE VARCHAR2(30));

CREATE TABLE PROPRIETARI (
KPROP NUMBER,NOME VARCHAR2(20),INDIRIZZO VARCHAR2(30));

CREATE TABLE VEIPROP (KPROP NUMBER,KVEI NUMBER,MDTINI DATE,MDTEND DATE);

quindi inseriamo dei record di prova:

INSERT INTO VEICOLI (KVEI,TARGA,DESCRIZIONE) VALUES(1,'TI-00011','BMW 520');
INSERT INTO VEICOLI (KVEI,TARGA,DESCRIZIONE) VALUES(2,'TI-00022','AUDI A4 TDI');
INSERT INTO VEICOLI (KVEI,TARGA,DESCRIZIONE) VALUES(3,'TI-00033','PORSCHE CARR.');
INSERT INTO VEICOLI (KVEI,TARGA,DESCRIZIONE) VALUES(4,'TI-00044','ALFA ROMEO GTV');
INSERT INTO VEICOLI (KVEI,TARGA,DESCRIZIONE) VALUES(5,'TI-00055','FORD MOD T');

INSERT INTO PROPRIETARI (KPROP,NOME ,INDIRIZZO) VALUES(1,'ALDO','VIA UNO');
INSERT INTO PROPRIETARI (KPROP,NOME ,INDIRIZZO) VALUES(2,'BRUNO','VIA DUE');
INSERT INTO PROPRIETARI (KPROP,NOME ,INDIRIZZO) VALUES(3,'CARLO','VIA TRE');

INSERT INTO VEIPROP (KPROP,KVEI,MDTINI) VALUES(1,1,SYSDATE);
INSERT INTO VEIPROP (KPROP,KVEI,MDTINI) VALUES(1,2,SYSDATE);
INSERT INTO VEIPROP (KPROP,KVEI,MDTINI) VALUES(2,3,SYSDATE);
INSERT INTO VEIPROP (KPROP,KVEI,MDTINI) VALUES(2,4,SYSDATE);
INSERT INTO VEIPROP (KPROP,KVEI,MDTINI) VALUES(3,5,SYSDATE);

LE RELAZIONI

La tabella VEIPROP funge da tramite tra i PROPRIETARI ed i VEICOLI. Questa unione è realizzata dai campi:

  • VEIPROP.KPROP -> PROPRIETARI
  • VEIPROP.KVEI -> VEICOLI

quindi per avere una lista completa metteremo in JOIN le tre tabelle:

SELECT T1.NOME,T2.TARGA
FROM PROPRIETARI T1,VEICOLI T2,VEIPROP T3
WHERE 1=1
AND T1.KPROP=T3.KPROP
AND T2.KVEI=T3.KVEI

ed avremo:

CARLO TI-00055
ALDO TI-00011
ALDO TI-00022
BRUNO TI-00033
BRUNO TI-00044

Il risultato mostra una riga per ogni veicolo.

LISTA AGGREGATA

Un miglioramento potrebbe essere quello di mettere sulla stessa riga tutti i veicoli che appartengono ad un proprietario. Ecco quindi l’utilizzo della funzione LISTAGG:

SELECT T1NOME, LISTAGG(T2TARGA,';') within group (order by T1NOME) MLIST
FROM (
SELECT T1.NOME T1NOME,T2.TARGA T2TARGA
FROM PROPRIETARI T1,VEICOLI T2,VEIPROP T3
WHERE 1=1
AND T1.KPROP=T3.KPROP
AND T2.KVEI=T3.KVEI )
GROUP BY T1NOME;

ed ecco il risultato:

ALDO TI-00011;TI-00022
BRUNO TI-00033;TI-00044
CARLO TI-00055

Nella query precedente è stato definito il punto-e-virgola come separatore.

ALTRO ESEMPIO

Un altro caso di liste aggregate è un elenco di indici per ogni tabella dello schema:

SELECT table_name,LISTAGG(index_name, '**') WITHIN GROUP (ORDER BY table_name) AS mindex
FROM USER_INDEXES
GROUP BY table_name
ORDER BY table_name;

CONCLUSIONE

LISTAGG è una funzione molto utile per disporre di seguito nella stessa riga i dati di una colonna.

 

 

Leave a Reply