Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922

    [MySql] calcolo percentuali gruppi

    Ho una tabella di questo tipo frutto di un raggruppamento.

    codice:
    anno   quanti
    2002     2
    2003     1
    2004     4
    2005    12
    2006     2
    per calcolare la percentuale faccio così

    select @totale := count(*) from tabella
    select year(mdata),count(year(mdata)),count(year(mdata))* 100/@totale as percentuale
    from tabella group by year(mdata)

    vorrei sapere se è possibile calcolare le percentuali senza dover prima definire una variabile.
    Grazie.

  2. #2
    percentuale di che? della numerosita' degli anni???

    se si, fai una subquery...

    codice:
    select year(mdata),
    count(year(mdata)),
    count(year(mdata)) * 100 / (select count(*) from tabella)  as percentuale
    from tabella 
    group by year(mdata)
    questo e' un altro modo, ma con la variabile i record vengono contati una sola volta, mentre con la subquery una volta per ogni raggruppamento. In realta' i record non vengono materialmente contati con count(*), il dato (numero dei record presenti) e' gia' disponibile senza dover contare nulla.



    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da piero.mac
    percentuale di che? della numerosita' degli anni???

    se si, fai una subquery...

    codice:
    select year(mdata),
    count(year(mdata)),
    count(year(mdata)) * 100 / (select count(*) from tabella)  as percentuale
    from tabella 
    group by year(mdata)
    questo e' un altro modo, ma con la variabile i record vengono contati una sola volta, mentre con la subquery una volta per ogni raggruppamento. In realta' i record non vengono materialmente contati con count(*), il dato (numero dei record presenti) e' gia' disponibile senza dover contare nulla.


    Ciao Piero. Scusa ma non ho capito cosa intendi con il numero dei record presenti è già disponibile senza dover contare nulla.

    edit. Allora non sarebbe necessaria la subquery per contarli? :master:

  4. #4
    Originariamente inviato da nicola75ss
    Ciao Piero. Scusa ma non ho capito cosa intendi con il numero dei record presenti è già disponibile senza dover contare nulla.
    Significa che, se e solo se usi tabelle Isam o MyIsam, il numero di righe viene tenuto dal server in una apposita variabile di tabella senza bisogno di ricontare i record fisicamente, quindi in quel caso una SELECT COUNT(*) FROM tabella (solo senza clausole WHERE!) è quindi una istruzione molto veloce.

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da skidx
    Significa che, se e solo se usi tabelle Isam o MyIsam, il numero di righe viene tenuto dal server in una apposita variabile di tabella senza bisogno di ricontare i record fisicamente, quindi in quel caso una SELECT COUNT(*) FROM tabella (solo senza clausole WHERE!) è quindi una istruzione molto veloce.
    Adesso sono ancora più confuso.
    Nello specifico la mia tabella è di tipo InnoDB. Quale differenza comporta per la mia query?

  6. #6
    Originariamente inviato da skidx
    Significa che, se e solo se usi tabelle Isam o MyIsam, il numero di righe viene tenuto dal server in una apposita variabile di tabella senza bisogno di ricontare i record fisicamente, quindi in quel caso una SELECT COUNT(*) FROM tabella (solo senza clausole WHERE!) è quindi una istruzione molto veloce.
    in effetti, pero' count(*) non e' correttissimo per il calcolo percentuale o statistico in genere, il count(*) conteggia tutti i record non considerando i campi NULL che potrebbero essere presenti nelle varie colonne interessate alla statistica.

    in pratica count(*) conta tutti i record, count(campo) esclude i campi NULL (ma non i vuoti NOT NULL).

    in pratica:

    select count(*) from tabella where campo is not NULL.
    select count(campo) from tabella

    sono equivalenti.

    Per le tabelle che supportano le transizioni tipo le innodb la risposta del count(*) non puo' chiaramente essere sempre identica per tutti.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Originariamente inviato da nicola75ss
    Adesso sono ancora più confuso.
    Nello specifico la mia tabella è di tipo InnoDB. Quale differenza comporta per la mia query?
    che il conteggio dei record viene sempre eseguito.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Il mio campo data non contiene valori NULL e nemmeno vuoti NOT NULL.
    Quindi Piero la query che mi hai proposto all'inizio dovrebbe essere perfetta.

  9. #9
    Originariamente inviato da nicola75ss
    Il mio campo data non contiene valori NULL e nemmeno vuoti NOT NULL.
    Quindi Piero la query che mi hai proposto all'inizio dovrebbe essere perfetta.
    Non ho detto "quella" query ma genericamente per il conteggio dei campi che devono essere calcolati/contati... che poi alla fin della fiera per me il campo NULL esiste specialmente per queste cose.

    Se usi un sistema valido questo sara' sempre valido e diventera' il tuo "modus operandi".


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da piero.mac
    Non ho detto "quella" query ma genericamente per il conteggio dei campi che devono essere calcolati/contati... che poi alla fin della fiera per me il campo NULL esiste specialmente per queste cose.

    Se usi un sistema valido questo sara' sempre valido e diventera' il tuo "modus operandi".

    Grazie ad entrambi per l'aiuto.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.