[Risolto] Query per ogni anno

Discussioni sulle caratteristiche di database
Rispondi
marce84
Messaggi: 22
Iscritto il: domenica 2 giugno 2019, 20:33

[Risolto] Query per ogni anno

Messaggio da marce84 »

Ciao a tutti, ahimè mi sono bloccato e nuovamente son qui a chiedervi una dritta.
Sto provando a fare una query senza riuscirci che per ogni anno mi sommi degli importi di modo da ottenere questo risultato:
2018 2019
Gianluca € 1000 Gianluca € 1500
Marco € 700 Marco € 250
Mario € 100 Mario € 200
Francesca € 0 Francesca € 500

tutto questo non solo per confrontare i risultati per ogni anno ma anche perché mi servirebbe verificare la percentuale di variazione da un anno all'altro.

Grazie a chi mi aiuterà :)
Allego esempio
Allegati
prova1.odb
(4.63 KiB) Scaricato 141 volte
Ultima modifica di marce84 il mercoledì 24 luglio 2019, 19:59, modificato 1 volta in totale.
Libreoffice 5.1.6.2 su Ubuntu 16.04.6
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Query per ogni anno

Messaggio da charlie »

Ciao, al volo:

Codice: Seleziona tutto

SELECT "nome", YEAR( "data" ) AS "Anno", SUM( "importo" ) AS "Importo" FROM "Tabella1" GROUP BY "nome", YEAR( "data" ) ORDER BY "nome" ASC
ma forse si può fare meglio (con un po' di tempo a disposizione).
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Query per ogni anno

Messaggio da charlie »

Così dovrebbe essere meglio:

Codice: Seleziona tutto

SELECT "nome", SUM(CASEWHEN(YEAR("data") = 2018, ("importo"), NULL)) AS "2018", SUM(CASEWHEN(YEAR("data") = 2019, ("importo"), NULL)) AS "2019" FROM "Tabella1" GROUP BY "nome" ORDER BY "nome" DESC
Allegati
Schermata 2019-07-19 alle 07.59.55.png
Schermata 2019-07-19 alle 07.59.55.png (11.05 KiB) Visto 3788 volte
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
marce84
Messaggi: 22
Iscritto il: domenica 2 giugno 2019, 20:33

Re: Query per ogni anno

Messaggio da marce84 »

Charlie complimenti la tua soluzione è ottima, ho modificato leggermente il codice inserendo la funzione Year (Now()) di modo che la sommatoria si aggiorni automaticamente sull'anno in corso, invece sulle operazioni matematiche ho qualche perplessità, somme e differenze sono corrette, ho provato invece a fare un rapporto per il calcolo delle percentuali ed il risultato è errato, riesci a dirmi cosa sto sbagliando?
Allego l'esempio ritoccato.
Allegati
prova1.odb
(4.94 KiB) Scaricato 144 volte
Libreoffice 5.1.6.2 su Ubuntu 16.04.6
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Query per ogni anno

Messaggio da charlie »

Credo che il problema sia dovuto alla divisione fra numeri interi (i record dei campi 2019 e 2018 lo sono).
Per ovviare e per non fare troppe operazioni nella stessa query, salva Ricerca2 come Vista2 e fai una nuova query su Vista2 trasformando con la funzione CAST gli interi in decimali:

Codice: Seleziona tutto

SELECT "nome", "2019", "2018", "differenze", ( CAST( "differenze" AS DECIMAL ( 8 , 2 ) ) ) / ( CAST( "2018" AS DECIMAL ( 8 , 2 ) ) ) * 100 AS "%" FROM "Vista2"
Vedi Ricerca3 nel file allegato.
Schermata 2019-07-19 alle 23.18.30.png
Schermata 2019-07-19 alle 23.18.30.png (13.92 KiB) Visto 3774 volte
Allegati
prova2.odb
(6.21 KiB) Scaricato 144 volte
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
marce84
Messaggi: 22
Iscritto il: domenica 2 giugno 2019, 20:33

Re: Query per ogni anno

Messaggio da marce84 »

ok Charlie,
adesso mi è tutto più chiaro ho testato sul mio database e funziona bene, ti ringrazio per la tua competenza.
Ora mi sto spingendo oltre nel senso che sto provando a fare i confronti non solo tra 2 anni diversi ma tra due mesi di 2 anni diversi( es. gennaio 2018 con gennaio 2019)
ho visto da alcuni vostri lavori che usate la funzione to_char, ho provato a replicare abbinandola alla tua soluzione ma ci sono riuscito parzialmente
Ti faccio un esempio pratico sul file che ti ho postato:

SELECT "nome", SUM( casewhen( to_char( "data", 'MM/YY' ) = '01/19', ( "importo" ), 0 ) ) AS "gennaio 2019", SUM( casewhen( to_char( "data", 'MM/YY' ) = '01/18', ( "importo" ), 0 ) ) AS "gennaio 2018" FROM "Tabella1" GROUP BY "nome" ORDER BY "nome" ASC

ora questo va bene per confrontare gennaio 2018 con gennaio 2019, ma io sto provando ad automatizzare la ricerca inserendo la funzione now() per non mettere mano al codice ogni volta che inizia un nuovo anno, in questo caso quando sostituisco 2019 con year(now()) e 2018 con year(now()) -1 il risultato è zero. Cosa sbaglio???

SELECT "nome", SUM( casewhen( to_char( "data", 'MM/YY' ) = '01/year (now())', ( "importo" ), 0 ) ) AS "gennaio 2019", SUM( casewhen( to_char( "data", 'MM/YY' ) = '01/year (now())-1', ( "importo" ), 0 ) ) AS "gennaio 2018" FROM "Tabella1" GROUP BY "nome" ORDER BY "nome" ASC

Allego file
Allegati
prova3.odb
(6.63 KiB) Scaricato 139 volte
Libreoffice 5.1.6.2 su Ubuntu 16.04.6
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Query per ogni anno

Messaggio da charlie »

Ciao, lavora su quanto segue. Prova ad aprire una query nuova e testa questo codice

Codice: Seleziona tutto

SELECT  to_char( "data", 'MM/YY' ) FROM "Tabella1"
avrai come risultato una stringa che rappresenta una data nel formato mm/aa (anno di 2 cifre).
Poi:

Codice: Seleziona tutto

SELECT  '01/year (now())' FROM "Tabella1"
avrai come risultato una stringa sempre uguale : "01/year (now())" che non ti serve a niente.

Se le metti a confronto, come hai fatto, con CASEWHEN, il risultato sarà sempre zero.
Al suo posto puoi provare:

Codice: Seleziona tutto

SELECT  '01' || '/' || YEAR( NOW( ) ) FROM "Tabella1"
che ti darà la stringa che rappresenta la data "01/2019" (l'anno è di 4 cifre).

Ma per confrontarla con CASEWHEN dovrai cambiare anche to_char("data", 'MM/YY') in to_char("data", 'MM/YYYY')

P.S. Le date che stai testando non contengono il mese di gennaio, quindi avrai ancora risultato zero. Per vedere qualcosa devi passare ad un mese diverso.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
marce84
Messaggi: 22
Iscritto il: domenica 2 giugno 2019, 20:33

Re: Query per ogni anno

Messaggio da marce84 »

Ciao Charlie,
ho creato la query ricerca 6:

Codice: Seleziona tutto

SELECT MONTH( "data" ), SUM( casewhen( to_char( "data", 'MM/YYYY' ) = MONTH( "data" ) || '/' || YEAR( NOW( ) ), ( "importo" ), 0 ) ) AS "2019", SUM( casewhen( to_char( "data", 'MM/YYYY' ) = MONTH( "data" ) || '/' || YEAR( NOW( ) ), ( "importo" ), 0 ) ) AS "2018" FROM "Tabella1" GROUP BY MONTH( "data" ) ORDER BY MONTH( "data" ) ASC
credevo di averci preso ma in realtà alcune somme sono sballate, solo una è corretta, come mai?
Allegati
prova3.odb
(6.97 KiB) Scaricato 139 volte
Libreoffice 5.1.6.2 su Ubuntu 16.04.6
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Query per ogni anno

Messaggio da charlie »

Questi sono i "raffronti" che la tua query fa usando la funzione CASEWHEN, come vedi ci sono delle differenze. Corrisponde solo il mese 11.
Schermata 2019-07-24 alle 07.24.26.png
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Query per ogni anno

Messaggio da charlie »

Risolvi con una sola M:

Codice: Seleziona tutto

to_char( "data", 'M/YYYY' )
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
marce84
Messaggi: 22
Iscritto il: domenica 2 giugno 2019, 20:33

Re: Query per ogni anno

Messaggio da marce84 »

Charlie sei il numero uno :super:
Libreoffice 5.1.6.2 su Ubuntu 16.04.6
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Query per ogni anno

Messaggio da charlie »

Grazie.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Rispondi