Navigazione

  • CATEGORIES
  • Discussioni
  • Non letti
  • Recenti
  • Hashtags
  • Popolare
  • Utenti
  • Registrati
  • Accedi
Privacy - Termini e condizioni
© 2020 Search On Media Group S.r.l.
  • Registrati
  • Accedi
  • CATEGORIES
  • Discussioni
  • Non letti
  • Recenti
  • Hashtags
  • Popolare
  • Utenti
  • Stream
  • Interest
  • Categories
  1. Home
  2. Categorie
  3. Coding e Sistemistica
  4. Coding
  5. Query sql complessa
Questa discussione è stata cancellata. Solo gli utenti con diritti di gestione possono vederla.
  • M
    mrkrabs User Newbie • 19 gen 2011, 12:44 ultima modifica di

    Query sql complessa

    Ciao a tutti,

    ho bisogno di una mano riguardo alla seguente query:

    Select *,ROUND(avg(p.voto),2) as votodue,ROUND(avg(s.voto),2) as vototre
    FROM products p JOIN products s ON p.name=s.name
    WHERE p.tipo="Orale" and s.tipo="Scritto"
    GROUP BY name

    la mia tabella è formata da:
    _id name tipo data voto quadrimestre

    ora la select che ho scritto seleziona la media voti degli orali, la media voto degli scritti.
    Però il mio problema è che se NON ho nella tabella entrambi i voti scritto ed orale, non viene selezionata nessuna riga.
    Voglio che anche se ho come voto solo l'orale, mi venga restituita la riga cosi:

    mediavotoorale mediavotoscritto
    7

    cioè con il campo mediavotoscritto nullo

    come posso fare?
    grazie

    0 Miglior Risposta Ringrazia Cita Rispondi

      1 Risposta Ultima Risposta
      Caricamento altri post
      Rispondi
      • Topic risposta
      Effettua l'accesso per rispondere
      • Da Vecchi a Nuovi
      • Da Nuovi a Vecchi
      • Più Voti
       

    • M
      magicale User Attivo • 19 gen 2011, 14:46 ultima modifica di

      Ciao,
      con una JOIN come hai fatto tu, non so se sia possibile, o almeno, non mi è venuto in mente nulla.

      Così invece dovrebbe funzionare:

      
      SELECT * , 
      ROUND( SUM( IF( tipo="Orale" , voto, 0 ) ) / SUM( if( tipo="Orale", 1, 0 ) ) , 2 ) AS votodue, 
      ROUND( SUM( IF( tipo="Scritto" , voto, 0 ) ) / SUM( if( tipo="Scritto", 1, 0 ) ) , 2 ) AS vototre 
      FROM products GROUP BY nome
      
      

      Capisco che avere una singola query che fa tutto possa apparir comodo... ma fare due query, una per tipo di voto, non è peccato...

      0 Miglior Risposta Ringrazia Cita Rispondi

        1 Risposta Ultima Risposta
      • G
        gorka Super User • 19 gen 2011, 15:23 ultima modifica di

        Se ho capito bene il problema, puoi affrontarlo con un IFNULL http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

        0 Miglior Risposta Ringrazia Cita Rispondi

          1 Risposta Ultima Risposta
        • M
          mrkrabs User Newbie • 19 gen 2011, 15:27 ultima modifica di

          Ciao e grazie per avermi risposto,

          allora ho provato con il tuo metodo ma ottengo un errore.

          quindi ho provato a semplificare un po le cose.

          questa è la query che mi hai proposto...l'ho provata ma non va

          
          SELECT *,SUM(IF(tipo="Orale",voto,0))/SUM(if(tipo="Orale",1,0)) AS votodue FROM products GROUP BY name
          

          poi ho provato questa che funziona

          
          SELECT *,AVG(voto) AS votodue FROM products WHERE tipo="Orale" GROUP BY name
          

          se è presente un voto orale non dovrebbe tornare la stessa cosa? perchè la prima non va?

          Praticamente ciò che voglio ottenere è una tabella con

          materia mediavotiorali mediavotiscritti

          utilizzando 1 sola query

          0 Miglior Risposta Ringrazia Cita Rispondi

            1 Risposta Ultima Risposta
          • M
            magicale User Attivo • 19 gen 2011, 15:34 ultima modifica di

            @MrKrabs said:

            allora ho provato con il tuo metodo ma ottengo un errore.
            Che errore ti da?

            0 Miglior Risposta Ringrazia Cita Rispondi

              1 Risposta Ultima Risposta
            • M
              mrkrabs User Newbie • 19 gen 2011, 15:44 ultima modifica di

              Si utilizzo questa select sql come linguaggio ospite del java per ottenere dei dati dal db.
              Intedevo che il programma in java mi da un errore quando deve eseguire questa query. l'errore però nn è specificato, si interrompe il programma e basta.

              Un appunto se è importante non so, ma utilizzo un DatabaseSQLite

              0 Miglior Risposta Ringrazia Cita Rispondi

                1 Risposta Ultima Risposta
              • M
                magicale User Attivo • 19 gen 2011, 16:07 ultima modifica di

                Si, era un appunto importante 😛
                SQLite non ha la funzione IF, ma ha CASE

                Al posto di

                
                IF(tipo="Orale",voto,0)
                
                

                dovrebbe essere

                
                CASE WHEN (tipo="Orale") THEN voto ELSE 0 END
                
                

                e gli altri IF, van modificati allo stesso modo.

                Edit:
                MySql (almeno la mia versione/configurazione) ritorna NULL quando trova una divisione per 0, SQLite non so.

                0 Miglior Risposta Ringrazia Cita Rispondi

                  1 Risposta Ultima Risposta
                • M
                  mrkrabs User Newbie • 19 gen 2011, 16:29 ultima modifica di

                  SIIIIIIIII!!!!! non finirò mai di ringraziarti!!!
                  grazie mille...sono 3gg che impazzisco!

                  SELECT *,ROUND( SUM( CASE WHEN (tipo=\"Orale\") THEN voto ELSE 0 END ) / SUM( CASE WHEN (tipo=\"Orale\") THEN 1 ELSE 0 END ) , 2 ) AS orale,ROUND( SUM( CASE WHEN (tipo=\"Scritto\") THEN voto ELSE 0 END ) / SUM( CASE WHEN (tipo=\"Scritto\") THEN 1 ELSE 0 END ) , 2 ) AS scritto FROM products GROUP BY name
                  

                  Un ultima cosa dato che tra case, when, then, else, end non ci capisco nulla.

                  se volessi la media di tutti voti scritti ed orali?
                  va bene cosi? oppure correggimi se sbaglio

                  ROUND( SUM( CASE voto ELSE 0 END ) / SUM( CASE 1 ELSE 0 END ) , 2 ) AS mediatotale
                  

                  Ancora grazie mille!

                  0 Miglior Risposta Ringrazia Cita Rispondi

                    1 Risposta Ultima Risposta
                  • M
                    magicale User Attivo • 19 gen 2011, 16:40 ultima modifica di

                    Se vuoi la media di tutto, senza distinzione tra scritto e orale, ti basta ROUND ( AVG(voto) , 2)

                    0 Miglior Risposta Ringrazia Cita Rispondi

                      1 Risposta Ultima Risposta
                    • M
                      mrkrabs User Newbie • 20 set 2011, 16:54 ultima modifica di

                      Ciao magicale,
                      a distanza di tempo ho un'altra domandina su questa query, dato che ho notato uno strano comportamento.

                      Possiamo considerare solo questa selezione.

                      SELECT *,ROUND( SUM( CASE WHEN (tipo=\"Orale\") THEN voto ELSE 0 END ) / SUM( CASE WHEN (tipo=\"Orale\") THEN 1 ELSE 0 END ) , 2 ) AS orale FROM products GROUP BY name
                      

                      ho notato che ad esempio la media tra 6 e 7 da come risultato 6 senza cifre dopo la virgola.

                      Invece la media tra 6.5 e 7 da come risultato 6.75.

                      questo è la stranezza...mi chiedo perchè nella media tra 6 e 7 non si ha come risultato 6.5 o 6.50?

                      grazie

                      0 Miglior Risposta Ringrazia Cita Rispondi

                        1 Risposta Ultima Risposta
                      Caricamento altri post
                      Rispondi
                      • Topic risposta
                      Effettua l'accesso per rispondere
                      • Da Vecchi a Nuovi
                      • Da Nuovi a Vecchi
                      • Più Voti