Pannello di Controllo Moderatore ]

[Risolto]Dubbio uso SELECT MAX e funzioni di aggregazione

Discussioni sulle caratteristiche di database

[Risolto]Dubbio uso SELECT MAX e funzioni di aggregazione

Messaggioda Zago_87 » domenica 14 giugno 2020, 16:47

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
Zago_87
 
Messaggi: 109
Iscritto il: giovedì 15 gennaio 2015, 0:53

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggioda charlie » domenica 14 giugno 2020, 17:16

Ciao, le funzioni di aggregazione richiedono la loro presenza in tutti i campi visualizzati nella query.
charlie
macOS 10.12 Sierra: Open Office 4.1.7 - LibreOffice 6.2.8.2
http://www.charlieopenoffice.altervista.org
Avatar utente
charlie
Site Admin
Site Admin
 
Messaggi: 6937
Iscritto il: mercoledì 19 dicembre 2012, 11:50

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggioda Zago_87 » domenica 14 giugno 2020, 21:12

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   Espandi visualeStringi visuale
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   Espandi visualeStringi visuale
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: 109
Iscritto il: giovedì 15 gennaio 2015, 0:53

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggioda Zago_87 » mercoledì 24 giugno 2020, 22:57

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
Zago_87
 
Messaggi: 109
Iscritto il: giovedì 15 gennaio 2015, 0:53

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggioda charlie » sabato 27 giugno 2020, 9:42

Credo di non aver capito bene la domanda.
Comunque, mi pare basti un solo passaggio:
Codice: Seleziona tutto   Espandi visualeStringi visuale
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 10.12 Sierra: Open Office 4.1.7 - LibreOffice 6.2.8.2
http://www.charlieopenoffice.altervista.org
Avatar utente
charlie
Site Admin
Site Admin
 
Messaggi: 6937
Iscritto il: mercoledì 19 dicembre 2012, 11:50

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggioda Zago_87 » lunedì 29 giugno 2020, 14:43

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 22 volte
LibreOffice 6.3.6
Windows 7 PRO
Avatar utente
Zago_87
 
Messaggi: 109
Iscritto il: giovedì 15 gennaio 2015, 0:53

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggioda charlie » martedì 30 giugno 2020, 15:14

Mi spiace, non conosco un altro modo.
charlie
macOS 10.12 Sierra: Open Office 4.1.7 - LibreOffice 6.2.8.2
http://www.charlieopenoffice.altervista.org
Avatar utente
charlie
Site Admin
Site Admin
 
Messaggi: 6937
Iscritto il: mercoledì 19 dicembre 2012, 11:50

Re: Dubbio utilizzo SELECT MAX e altre funzioni di aggregazi

Messaggioda Zago_87 » martedì 30 giugno 2020, 16:26

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
Avatar utente
Zago_87
 
Messaggi: 109
Iscritto il: giovedì 15 gennaio 2015, 0:53


Torna a Base

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti