[Risolto]Dubbio uso SELECT MAX e funzioni di aggregazione

Discussioni sulle caratteristiche di database
Rispondi
Avatar utente
Zago_87
Messaggi: 111
Iscritto il: mercoledì 14 gennaio 2015, 23:53

[Risolto]Dubbio uso SELECT MAX e funzioni di aggregazione

Messaggio da Zago_87 »

Ho un dubbio che leggendo in rete e sul forum non mi è del tutto sparito, prima di procedere a modificare il DB vorrei capire se concettualmente sto seguendo la strada migliore.

Dovrei utilizzare una funzione di aggregazione all'interno di una ricerca complessa.
Semplificando la mia situazione ho una ricerca i cui dati provengono da una tabella anagrafica con ID_Cliente e Nome_Cliente a cui faccio una semplice INNER JOIN con una seconda tabella, che contiene ID_Documento, ID_Cliente e Data_Documento. Ottengo quindi una tabella con:
Nome_Cliente| ID_Documento| Data_Documento

Ovviamente della tabella anagrafica vedo solo chi ha almeno una corrispondenza nei documenti e vedo n righe quanti sono i documenti di quel cliente.

Ora ho bisogno di una ulteriore colonna che mi restituisca l'ultima data di documento per ogni cliente (dovrà quindi replicarla su ogni riga nel caso siano più di una per cliente), userei la funzione MAX nella SELECT ma poi sono costretto a inserire tutti gli altri campi in un GROUP BY altrimenti la ricerca non funziona, è corretto?
Questa strada mi sembra non percorribile visto la complessità della ricerca sul mio DB, oltre a non essere riuscito a farla funzionare nella ricerca vera e propria in delle prove semplificate il risultato non era quello che mi aspettavo.

L'altra strada che ho pensato di seguire è quella di creare una vista di una ricerca che faccia solo l'operazione di associare all'anagrafica l'ultima data documento, poi collegare questa vista tramite una LEFT JOIN alla mia attuale ricerca.

Questa seconda strada è effettivamente la migliore o c'è una soluzione che mi permetta di evitare di appesantire il DB con una ricerca e una vista in più per ogni situazione di questo tipo?

Grazie per il supporto
Ultima modifica di Zago_87 il martedì 30 giugno 2020, 16:28, modificato 1 volta in totale.
LibreOffice 6.3.6
Windows 7 PRO
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8805
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggio da charlie »

Ciao, le funzioni di aggregazione richiedono la loro presenza in tutti i campi visualizzati nella query.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Avatar utente
Zago_87
Messaggi: 111
Iscritto il: mercoledì 14 gennaio 2015, 23:53

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggio da Zago_87 »

Ciao Charlie, quindi se nella SELECT uso una funzione di aggregazione in una delle colonne, GROUP BY di tutte le altre è l'unico modo per far funzionare la ricerca perché sostanzialmente non ci possono essere valori duplicati. Ho capito bene?

Il risultato che mi aspetto è questo:

Codice: Seleziona tutto

NomeCliente	ID_Doc	Data_Doc		MAX_Data
Pippo			180001	01/01/2018	 01/01/2019
Pippo			190002	01/01/2019	 01/01/2019
Topolino		180002	01/01/2018	 10/01/2020
Topolino		190001	01/01/2019	 10/01/2020
Topolino		200001	10/01/2020	 10/01/2020
Se seguo la strada del GROUP BY mi troverei con solo due righe come risultato, così:

Codice: Seleziona tutto

NomeCliente	ID_Doc	Data_Doc		MAX_Data
Pippo			190002	01/01/2019	 01/01/2019
Topolino		200001	10/01/2020	 10/01/2020
Quindi mi confermi che devo ricavare la data maggiore con una ricerca a parte e sfruttarla in questa tramite creazione di una vista per avere il risultato in alto con tutte e 5 le righe?
Giusto?
LibreOffice 6.3.6
Windows 7 PRO
Avatar utente
Zago_87
Messaggi: 111
Iscritto il: mercoledì 14 gennaio 2015, 23:53

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggio da Zago_87 »

Lo prendo per un si? :mrgreen:

Un'altra strada non mi è venuta in mente ma mi sembra strano dover fare una ricerca a parte solo per ricavarmi il massimo valore, poi sfruttare questa tramite vista per usare il dato all'interno di una ricerca più complessa :crazy:
Quando sono costretto a questi giri ho sempre la sensazione che mi stia sfuggendo qualcosa e di non seguire la strada corretta.
LibreOffice 6.3.6
Windows 7 PRO
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8805
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggio da charlie »

Credo di non aver capito bene la domanda.
Comunque, mi pare basti un solo passaggio:

Codice: Seleziona tutto

SELECT "NomeCliente", "ID_Doc", "Data_Doc", MAX( "Data_Doc" ) AS Max_Data FROM "Tabella1" GROUP BY "NomeCliente", "ID_Doc", "Data_Doc" ORDER BY "NomeCliente" ASC
Schermata 2020-06-27 alle 09.35.23.png
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Avatar utente
Zago_87
Messaggi: 111
Iscritto il: mercoledì 14 gennaio 2015, 23:53

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggio da Zago_87 »

Scusa Charlie ma ho avuto un po' da fare, ho scelto di creare un db da allegare (lo so avrei dovuto prima) per spiegarmi meglio.

Nella Ricerca 1 provo a utilizzare quello che mi hai suggerito tu, ma non funziona, ovvero nella colonna che tu chiami "Max_Data" e che io ho chiamato "Ultimo documento" viene replicata la data del documento a fianco. Anche nella immagine da te postata è così in effetti.

Nella Ricerca 2 semplifico ulteriormente e mi faccio restituire solo la data massima, ultima, e funziona.

La ricerca 3 non è altro che la soluzione che avevo trovato ma che non mi sembrava la via migliore, ovvero ho la mia ricerca con i vari campi, del tutto uguale alla Ricerca 1, tranne che per la colonna "Ultimo documento" per la quale sfrutto una vista creata sulla base della Ricerca 2.

Questa terza soluzione funziona, ma mi sembra appesantire il DB e non essere la migliore strada.

Il quesito è: cosa sbaglio nella Ricerca 1? Si può correggere evitandomi la creazione di una vista e della ulteriore JOIN ottenendo lo stesso risultato della Ricerca 3?
Allegati
Test SELECT MAX.odb
(6.11 KiB) Scaricato 123 volte
LibreOffice 6.3.6
Windows 7 PRO
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8805
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggio da charlie »

Mi spiace, non conosco un altro modo.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Avatar utente
Zago_87
Messaggi: 111
Iscritto il: mercoledì 14 gennaio 2015, 23:53

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggio da Zago_87 »

Quindi mi confermi che quello che ottengo con la Ricerca 3 non è ottenibile sistemando il codice della Ricerca 1, peccato.

Grazie 1000 come sempre per il supporto, procedo come avevo ipotizzato.


Se può essere utile ad altri chiarisco che quella colonna con la data maggiore per cui ho cercato la soluzione più pulita con questo post, che rappresenta quindi l'ultimo documento emesso per ogni cliente, servirà per filtrare una ricerca, utile ad esempio in caso di:
  • - Rinnovi periodici / scadenze
    - Controllo clienti a cui non emetto documenti da X tempo
    - ecc...
avendo comunque la possibilità di stampare in un rapporto, nella stessa procedura, anche lo storico di quel cliente.
LibreOffice 6.3.6
Windows 7 PRO
Rispondi