Problemi di ordinamento

di il
14 risposte

Problemi di ordinamento

Ciao a tutti,

ho creata la seguente query:

SELECT Foglio1.[Money map], Sum(Foglio1.Uscite) AS SommaDiUscite, Format$([Foglio1].[data],"mmmm yyyy") AS expr1
FROM Foglio1
GROUP BY Foglio1.[Money map], Format$([Foglio1].[data],"mmmm yyyy")
ORDER BY Format$([Foglio1].[data],"mmmm yyyy");

che della tabella Foglio1 fa la somma del campo valore [uscite] per categorizzazione  del campo [ money map]  e per mese/anno.

Il campo mese/anno lo estraggo con la funzione Format$([Foglio1].[data],"mmmm yyyy"

Funziona tutto tranne l'ordinamento che vorrei fosse per mese/anno cioè ad esempio gennaio/2023 febbraio 2023 invece me li ordina in questo modo: agosto 2023, agosto 2024 aprile 2023, aprile 2024 e così via. Probabilmente ciò deriva dal fatto che l'estrazione Format$([Foglio1].[data],"mmmm yyyy" viene memorizzata come stringa e quindi il tutto viene trattato come stringa.

Gentilmente potete aiutarmi a capire come posso modificare l'ordinamento?

Grazie

14 Risposte

  • Re: Problemi di ordinamento

    Togli la formattazione alla data e ordina per data.

  • Re: Problemi di ordinamento

    Grazie Sishandrea,

    se tolgo la formattazione non mi fa il raggruppamento per mese e anno.

    Ma per data.

  • Re: Problemi di ordinamento

    15/08/2024 - tatixtatix6 ha scritto:


    ORDER BY [Foglio1].[data]

    Che significa raggruppamento per mese anno?

    Group by expr1…

  • Re: Problemi di ordinamento

    Prova a cambiare la query nel seguente modo:

    SELECT Foglio1.[Money map], Sum(Foglio1.Uscite) AS SommaDiUscite, Format$([Foglio1].[data],"mmmm yyyy") AS Periodo
    FROM Foglio1
    GROUP BY Foglio1.[Money map], Format$([Foglio1].[data],"mmmm yyyy"), Format$([Foglio1].[data],"yyyy mm")
    ORDER BY Format$([Foglio1].[data],"yyyy mm");
  • Re: Problemi di ordinamento

    15/08/2024 - tatixtatix6 ha scritto:


    se tolgo la formattazione non mi fa il raggruppamento per mese e anno.

    Ma per data.

    Vuoi ordinare o raggruppare?

  • Re: Problemi di ordinamento

    Il Campo che ottieni con il Format è di tipo TESTO, motivo per cui non è possibile pensare possa ordinarlo come numero, “AGOSTO” è sicuramente il primo in ordine Alfabetico, quindi anche il suggerimento di @Stifone non può andare.

    Per ottenere quello che vuoi devi dividere Mese e Anno e mantenerli Numerici, una cosa simile:

    SELECT 	Year([Data]) AS YY, 
    		Month([Data]) AS MM, 
    		Strconv(MonthName(Month([Data])),3) AS MN
    FROM TuaTabella
    
    GROUP BY 
    		Year([Data]), Month([Data]), 
    		Strconv(MonthName(Month([Data])),3)
    		
    ORDER BY Year([Data]), Month([Data]);

    Se poi vuoi un campo con concatenato “Mese + anno” da mettere nell'elenco campi e nel GroupBy ma NON nell'ORDER BY

    (strconv(MonthName(Month([Data])),3) + ' ' + Year(Data)) As TuoCampoSpeciale

    Al posto di MonthName puoi usare Format

    (Strconv(Format([Data],"mmmm"),3) + ' ' + Year(Data)) As TuoCampoSpeciale

    Il valore 3 nella Funzione strConv equivale a: 

    vbProperCase3Converte la prima lettera di ogni parola nella stringa in maiuscolo.
  • Re: Problemi di ordinamento

    16/08/2024 - @Alex ha scritto:


    Il Campo che ottieni con il Format è di tipo TESTO, motivo per cui non è possibile pensare possa ordinarlo come numero, “AGOSTO” è sicuramente il primo in ordine Alfabetico, quindi anche il suggerimento di @Stifone non può andare.

    Ma no, dai! Nel momento in cui scrive 

    Format$(...,"yyyy mm")

    ottiene anno spazio numero del mese con due cifre (01, 02, 03, 04 e così via). Certo è pur sempre un ordinamento su testo ma viene giusto. Vero è che l'uso di Year e Month, restituendo valori numerici, semplifica il lavoro di ordinamento.

  • Re: Problemi di ordinamento

    E questa ne è la conferma:

    bisogna provare prima di dire che una cosa non va.

  • Re: Problemi di ordinamento

    Ciao a tutti, 

    vorrei in primo ringraziare tutti voi che mi avete dato una mano. Alex the top. Funziona perfettamente tutto a parte sostituire il “+” con la “&” commerciale.

    Per quanto riguarda Phil (altro TOP) ha sicuramente letto di corsa: se ad esempio si ha un campo testo così fatto “02 2021”, “03 2021”, “02 2022” con l'ordinamento con il testo avro' “02 2021”, “02 2022”, “03 2021” invece il desiderata è “02 2021”, “03 2021”, “02 2022”. 

    Lascio l'SQL per tutti (ma che poi in pratica è quello di Alex):

    SELECT Year(foglio1.[data]) AS YY, Month(foglio1.[data]) AS MM, StrConv(MonthName(Month(foglio1.[Data])),3) AS MN, Foglio1.[Money map], Sum(Foglio1.Uscite) AS SommaDiUscite, Sum(Foglio1.Entrate) AS SommaDiEntrate,  StrConv(MonthName(Month(foglio1.[Data])),3) & " " &  Year(foglio1.[data]) AS nnn
    FROM Foglio1
    GROUP BY Year([Data]), Month([Data]), StrConv(MonthName(Month([Data])),3), Foglio1.[Money map]
    ORDER BY Year([Data]), Month([Data]);
    

     Grazie ancora e un grosso ciao

  • Re: Problemi di ordinamento

    16/08/2024 - tatixtatix6 ha scritto:

    Per quanto riguarda Phil (altro TOP) ha sicuramente letto di corsa…

    TOP? del flop, se sembra che abbia letto in fretta. Allora, ho detto la mia su quanto scritto da @Alex cioè il fatto che il suggerimento di @Stifone fosse sbagliato. Precisato, come ho scritto sopra, che trattare l'anno ed il mese come numerici evita grattacapi inutili, non si può dire però che questa parte di @Stifone

    ORDER BY Format$([Foglio1].[data],"yyyy mm"); 

    sia sbagliata, perché comunque restituisce valori di testo che se ordinati vengono nell'ordine cronologico giusto. Tanto che ne ha riportato un esempio lui per primo.

    La differenza sta nel fatto che in select il periodo è ottenuto con questo

    Format$([Foglio1].[data],"mmmm yyyy")

    mentre per l'ordinamento la sintassi è un'altra. Ecco perché “Gennaio 2024” viene prima di “Aprile 2024”, perché l'ordinamento reale è tra “2024 01” e “2024 04”.

    Spero davvero di non aver fatto confusione su confusione e di non aver letto male davvero. Segui la strada suggerita da @Alex ma in quello che ha scritto @Stifone non c'è tutto da buttare (ho un dubbio sul group by ma non rileva per l'ordinamento)

  • Re: Problemi di ordinamento

    Grazie a tutti,

    avevo già visto che quanto suggerito da @Stifone c'era qualcosa che non andava. 

    Ho già chiesto l'intervento della community in altre occasioni e talvolta anche in maniera criptica, ho sempre ricevuto suggerimenti utili per risolvere i problemi.

    Sicuramente tu e Alex mi avete sempre dato un aiuto. E tramite i vostri suggerimenti sono cresciuto. Mi dispiace che faccio quest'attività per diletto, vorrei diventare un Esperto anche io. 

     Ciao

  • Re: Problemi di ordinamento

    16/08/2024 - Philcattivocarattere ha scritto:


    16/08/2024 - @Alex ha scritto:


    Il Campo che ottieni con il Format è di tipo TESTO, motivo per cui non è possibile pensare possa ordinarlo come numero, “AGOSTO” è sicuramente il primo in ordine Alfabetico, quindi anche il suggerimento di @Stifone non può andare.

    Ma no, dai! Nel momento in cui scrive 

    Format$(...,"yyyy mm")

    ottiene anno spazio numero del mese con due cifre (01, 02, 03, 04 e così via). Certo è pur sempre un ordinamento su testo ma viene giusto. Vero è che l'uso di Year e Month, restituendo valori numerici, semplifica il lavoro di ordinamento.

    Phil non diciamo cavolate.

    Quel dato è Testo altro che numero… non confondiamo le cose.

    Il fatto che restituisca correttamente l'ordinamento è perché 01-02…11-12 vengono ordinati nello stesso modo ma 01 non è numero… è testo.

    Quindi se diciamo che funziona concordo… non lo userei, ma questo è soggettivo.

  • Re: Problemi di ordinamento

    17/08/2024 - @Alex ha scritto:

    Quel dato è Testo altro che numero…

    Non l'ho mai messo in discussione, @Alex, guarda lì:

    16/08/2024 - Philcattivocarattere ha scritto:

    ottiene anno spazio numero del mese … Certo è pur sempre un ordinamento su testo ma viene giusto

    quindi l'ho sempre qualificato come testo anch'io. Però dire che il suggerimento di Stifone non va bene in assoluto è forse troppo categorico, tanto che alla fine arrivi anche tu con:

    17/08/2024 - @Alex ha scritto:

    se diciamo che funziona concordo

    e questo ho detto: funziona. Nemmeno io lo userei (come ho suggerito a tatixtatix6) nel momento in cui posso trattare direttamente con i numeri che non lasciano spazio a confusione quanto ad ordinamento.

  • Re: Problemi di ordinamento

    16/08/2024 - Philcattivocarattere ha scritto:

    ottiene anno spazio numero del mese con due cifre (01, 02, 03, 04 e così via). Certo è pur sempre un ordinamento su testo ma viene giusto. Vero è che l'uso di Year e Month, restituendo valori numerici, semplifica il lavoro di ordinamento.

    Il tema tecnico è che non è un numero con 2 cifre, è una stringa di 2 caratteri e come tale interpretata come testo.

    Definire che è un numero non ha senso… 

Devi accedere o registrarti per scrivere nel forum
14 risposte