Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481

    query con group by mi da risultati falsati

    Ho scritto una query che mi sta dando risultati falsati, non riesco a capire perchè.

    Tutto si gioca su una tabella 'ordini', in cui ogni riga rappresenta ovviamente un ordine, la query dovrebbe essere piuttosto semplice, ma non riesco a capire dove sbaglio...quello che cerco di tirare fuori è un report degli ordini raggruppati per mese con il totale per ogni mese, ho scritto la query così:
    Codice PHP:
    SELECT COUNTordini.id ) AS nr_ordiniSUMtotale ) AS totaleDATE_FORMATFROM_UNIXTIMEordini.data_ordine_ts ) ,  '%M %Y' ) AS 
    DATA 
    FROM  
    `ordini
    GROUP BY MONTHFROM_UNIXTIMEordini.data_ordine_ts ) ) 
    ORDER BY YEARFROM_UNIXTIMEordini.data_ordine_ts ) ) DESC MONTHFROM_UNIXTIMEordini.data_ordine_ts ) ) DESC 
    LIMIT 0 
    30 
    unico particolare, il campo data_ordine_ts è lo unix timestamp, per questo uso sempre la FROM_UNIXTIME(data_ordine_ts). Il problema è che mi tira fuori dati fasulli! Sono sbagliati gli importi totali per ciascun mese, il nr. totale degli ordini per ciascun mese, e addirittura non compaiono alcuni mesi...dove ho sbagliato nel preparare la query??

  2. #2
    Utente di HTML.it L'avatar di Mashin
    Registrato dal
    Jul 2010
    Messaggi
    187
    Usando una group by dovresti avere funzioni di aggregazione su tutti i campi.

    Sul time stamp non mi pare di vederne.

    La limit la usi a fare ? Selezionando solo 30 record potrebbe essere che quella ti sfalsi i risultati considerando solo 30 righe in input da 'ordini'

  3. #3
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da Mashin
    Usando una group by dovresti avere funzioni di aggregazione su tutti i campi.

    Sul time stamp non mi pare di vederne.

    La limit la usi a fare ? Selezionando solo 30 record potrebbe essere che quella ti sfalsi i risultati considerando solo 30 righe in input da 'ordini'
    Codice PHP:
    uso il GROUP BY MONTH FROM_UNIXTIMEordini.data_ordine_ts ) ) 
    questa è l'aggregazione sul time stamp, no?!

    il limit è stato messo da PHPMyAdmin, ma senza è uguale, e cmq in questo caso specifico il LIMIT mi fa vedere solo 30 mesi, non è che mi debba sfalsare i risultati

  4. #4
    Utente di HTML.it L'avatar di Mashin
    Registrato dal
    Jul 2010
    Messaggi
    187
    Puo' essere che mi sia confuso io sule limit che ora sto lavorando in SAS.

    Se fai
    codice:
    SELECT 
       COUNT(id) AS nr_ordini, 
       SUM(totale) AS totale, 
       MONTH( FROM_UNIXTIME(data_ordine_ts) ) AS  DATA  
    FROM  
       `ordini`  
    GROUP BY 
       MONTH( FROM_UNIXTIME(data_ordine_ts) )
    funziona ?

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Se raggruppi solo per mese i risultati saranno in base a quello, a prescindere dall'anno.

  6. #6
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da Mashin
    Puo' essere che mi sia confuso io sule limit che ora sto lavorando in SAS.

    Se fai
    codice:
    SELECT 
       COUNT(id) AS nr_ordini, 
       SUM(totale) AS totale, 
       MONTH( FROM_UNIXTIME(data_ordine_ts) ) AS  DATA  
    FROM  
       `ordini`  
    GROUP BY 
       MONTH( FROM_UNIXTIME(data_ordine_ts) )
    funziona ?
    Funziona ma mi da lo stesso identico risultato, il che è stranissimo, perchè oltre a non conteggiare gli ordini di dicembre 2010, non conteggia tutti quelli antecedenti dicembre 2009, non ne tiene proprio conto, ed i totali sono tutti sballati...mi sono scordato l'SQL?! Non capisco cosa faccio di sbagliato

  7. #7
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    codice:
    select from_unixtime(data_ordine_ts,'%Y-%m') as mese,
    count(id) as quanti,
    sum(totale) as totale
    from ordini
    group by mese
    order by mese desc

  8. #8
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da nicola75ss
    codice:
    select from_unixtime(data_ordine_ts,'%Y-%m') as mese,
    count(id) as quanti,
    sum(totale) as totale
    from ordini
    group by mese
    order by mese desc
    così funziona... ma cosa cambia?? scommetto che non vale la proprietà commutativa...

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da james
    così funziona... ma cosa cambia??
    Funziona perchè raggruppa per mese/anno. Raggruppando solo per mese, dicembre 2010 viene conteggiato insieme a dicembre 2009,2008 ecc. Idem per tutti i mesi.

  10. #10
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da nicola75ss
    Funziona perchè raggruppa per mese/anno. Raggruppando solo per mese, dicembre 2010 viene conteggiato insieme a dicembre 2009,2008 ecc. Idem per tutti i mesi.
    che idiota...non ci avevo minimamente pensato! GRAZIE!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.