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

    [MySql] Aggiungere zeri a un intervallo.

    Rieccomi con l'ennesimo dilemma su mysql. :master:
    Solito esempio chiarificatore.

    codice:
    id  data             valore
    1  2002-10-10        5
    2  2002-02-10       10
    3  2005-10-10       20
    4  2005-01-01       10
    5  2006-01-01        4
    ciò che vorrei ottenere
    codice:
    anno  totale
    2002    15
    2003     0
    2004     0
    2005    30
    2006     4
    Vorrei raggruppare per anno però aggiungendo gli zeri per gli anni che non risultano nel raggruppamento.
    Si può fare una cosa simile, magari con una join? Grazie.

  2. #2
    ma tu lo sai cosa e' un database. Se vuoi fargli contare quello che non c'e' devi dirgli "cosa" non c'e'.

    Basta mettere un record con la data di ogni anno mancante e valore zero e poi la somma la fara' per conto suo. aggiungi un record data anno-01-01 - val 0.

    Oppure installa la famosa release rilasciata a Lourdes.


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

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da piero.mac
    ma tu lo sai cosa e' un database. Se vuoi fargli contare quello che non c'e' devi dirgli "cosa" non c'e'.

    Basta mettere un record con la data di ogni anno mancante e valore zero e poi la somma la fara' per conto suo. aggiungi un record data anno-01-01 - val 0.

    Oppure installa la famosa release rilasciata a Lourdes.

    Ok, grazie. non ti arrabbiare Piero.

  4. #4
    Originariamente inviato da nicola75ss
    Ok, grazie. non ti arrabbiare Piero.
    ma chi s'arrabbia per cio'?

    Devi ragionare semplice. Vuoi un conteggio per tutti gli anni? fai in modo che ogni anno abbia un suo record a zero. Costa poco e rende tanto. Tienine conto se devi farci una media o contare i record, ma per la somma ....

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

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da piero.mac
    ma chi s'arrabbia per cio'?

    Devi ragionare semplice. Vuoi un conteggio per tutti gli anni? fai in modo che ogni anno abbia un suo record a zero. Costa poco e rende tanto. Tienine conto se devi farci una media o contare i record, ma per la somma ....
    Ok, seguirò il tuo consiglio.
    Grazie.

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Se non vuoi inserire "sporcizia" nel db potresti creare, quando ti serve fare l'estrazione, una tabella temporanea con un record per ogni anno e poi con una qualche join ottenere il risultato. Ovviamente devi avere il range delle annate ben definito.
    Come vedi è molto buttata lì, non ci ho fatto una gran pensata ma secondo me ci si dovrebbe riuscire.

  7. #7
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da luca200
    Se non vuoi inserire "sporcizia" nel db potresti creare, quando ti serve fare l'estrazione, una tabella temporanea con un record per ogni anno e poi con una qualche join ottenere il risultato. Ovviamente devi avere il range delle annate ben definito.
    Come vedi è molto buttata lì, non ci ho fatto una gran pensata ma secondo me ci si dovrebbe riuscire.
    Ti ringrazio Luca per la risposta. Quando ho aperto il thread pensavo che la soluzione potesse essere una cosa simile a quella che mi hai suggerito che però non riuscivo a concretizzare.
    In alternativa magari risolvo con php che probabilmente è la cosa più pulita e indolore.

  8. #8
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Prova così allora

    tabellaTemp sarebbe la tabella temporanea che devi avere appena creato, con la sola colonna "anno" che contiene una riga per ogni anno. Ti rimane da risolvere il problema di definire il range delle annate.

    codice:
    select tt.anno, ifnull(t.valore,0) from tabellaTemp tt left join 
    (select year(data) as anno, sum(valore) as valore from tabella group by anno ) as t on (tt.anno = t.anno)

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da luca200
    Prova così allora

    tabellaTemp sarebbe la tabella temporanea che devi avere appena creato, con la sola colonna "anno" che contiene una riga per ogni anno. Ti rimane da risolvere il problema di definire il range delle annate.

    codice:
    select tt.anno, ifnull(t.valore,0) from tabellaTemp tt left join 
    (select year(data) as anno, sum(valore) as valore from tabella group by anno ) as t on (tt.anno = t.anno)


    Per adesso l'ho rigirata così e mi sembra che vada bene.

    Codice PHP:
    // array di prova
    $array = array("1999" => 12"2002" => 15"2005" => 30"2006" => 3);
    $anni range(min(array_keys($array)),date('Y'));

    $str '<table>';
    foreach(
    $anni as $anno) {
        
    $str.= '<tr>';
        
    $str.= "<td>$anno</td>";
            if(
    array_key_exists($anno,$array)) {
                
    $str.='<td>'.current($array).'</td>';
                
    next($array);    
            }
            else
            
    $str.= '<td>0</td>';
        
    $str.= '</tr>';
    }
    $str.= '</table>';
    echo 
    $str
    Stanotte mi guardo con calma la query che mi hai postato. Grazie Luca.

  10. #10
    Sono irrimediabilmenti un anima semplice. Caricherei tutto su un array...

    Codice PHP:

    $array 
    = array(1999 => 02000 => 02001 => 0
                   
    2002 => 02003 => 02004 => 0
                   
    2005 => 02006 => 02007 => 0);
                            
    $query "select year(data) as anno, sum(valori) as tot
              from voti
              group by anno
              order by anno"
    ;

    $res mysql_query($query);

    while(
    $row mysql_fetch_assoc($res) ) {
     
       
    $array[$row['anno']] = $row['tot'];
     
    }
     
     
    print_r($array); 

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

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