Group By tra vers. 5.5 e 5.7

di il
1 risposte

Group By tra vers. 5.5 e 5.7

In un server MySql 5.5 sfruttavo una subquery annidata (ordinata desc) per ottenere, tramite una Group By nella query (del livello superiore) il valore maggiore.
Passando lo stesso codice sql ad un server MySql 5.7, non ottengo il risultato sperato, seppur non segnalandomi alcun errore.
Nella subquery non ho un Having, ma solamente una lunghissima Where .... però non c'è un raggruppamento qui !

Il codice è piuttosto lunghetto, quindi non vorrei tediarvi, ma posso riportarlo tranquillamente.

Avete idea di come posso risolvere ?

Grazie,
Alessio

1 Risposte

  • Re: Group By tra vers. 5.5 e 5.7

    Buongiorno a tutti.
    Diciamo che ho risolto creando una temporary table con la subquery annidata e così il raggrupamento mi dà il risultato sperato. In sintesi, dell'allievo che ha dato 2 esami della stessa materia, mi deve restituire il voto dell'ultimo esame sostenuto.
    Per coloro che hanno la pazienza di "farmi crescere professionalmente", espongo il codice sql della vers 5.5 per eventuali suggerimenti x il futuro. Grazie
    Alessio
    p.s. spero di non aver infranto regole/consigli del forum, nel caso ... segnalate please
    ------------------------------------
    select appo.codice_materia,appo.cfu,appo.descrizione_materia,appo.codice_allievo,appo.cognome_nome,appo.voto_max, appo.lode_max,appo.sessione,appo.materie_sessione0,appo.materie_sessione2,appo.materie_sessione1,appo.cfu_cons, appo.voto_somma,appo.ITER_RIDOTTO

    from (SELECT materie.CODICE as codice_materia, (materie.CFU_1 + materie.CFU_2) as cfu,
    materie.DESCRIZIONE as descrizione_materia,anagrafica_allievi.CODICE as codice_allievo,
    concat(anagrafica_allievi.COGNOME, ' ', anagrafica_allievi.NOME) as cognome_nome,IFNULL(voti.VOTO, 0) as voto_max, IFNULL(voti.LODE, 0) as lode_max, IFNULL(voti.SESSIONE, 0) as sessione,
    if (IFNULL(voti.SESSIONE, 0) = 0 and(IFNULL(voti.VOTO, 0) < 18),1,0) as materie_sessione0,
    (case when(IFNULL(voti.SESSIONE, 0) = 0) then 1 when(IFNULL(voti.SESSIONE, 0) = 2 and(IFNULL(voti.VOTO, 0) < 18)) then 1 else 0 end) as materie_sessione2,
    (case when(IFNULL(voti.SESSIONE, 0) = 0) then 1 when(IFNULL(voti.SESSIONE, 0) = 2) then 1 when(IFNULL(voti.SESSIONE, 0) = 1 and(IFNULL(voti.VOTO, 0) < 18)) then 1 else 0 end) as materie_sessione1,
    if ((IFNULL(voti.VOTO, 0) >= 18),(materie.CFU_1 + materie.CFU_2),0) as CFU_cons,
    (CASE WHEN materie.TIPO_MATERIA = 'DU' then IFNULL(voti.VOTO,0)*(materie.CFU_1 + materie.CFU_2) WHEN materie.TIPO_MATERIA = 'DTP' then IFNULL(voti.VOTO,0) else 0 end) as voto_somma,
    anagrafica_allievi.ITER_RIDOTTO
    FROM anagrafica_allievi
    LEFT JOIN materie ON materie.CORSO_CLASSE = anagrafica_allievi.CORSO_CLASSE AND materie.CORPO = anagrafica_allievi.CORPO LEFT JOIN voti ON anagrafica_allievi.CODICE = voti.CODICE AND materie.CODICE = voti.MATERIA
    LEFT JOIN tipi_interrogazione ON voti.INTERROGAZIONE = tipi_interrogazione.id_row
    where anagrafica_allievi.CORSO_CLASSE = 39 and anagrafica_allievi.CORPO = 'SM' AND voti.ASSENTE = 'N' AND (anagrafica_allievi.dimissioni_rinvio <> 'R'
    and anagrafica_allievi.dimissioni_rinvio <> 'D' and anagrafica_allievi.dimissioni_rinvio <> 'E')
    and(voti.convalida = 1 or ISNULL(voti.CONVALIDA)) and (voti.statistica='S' or IFNULL(voti.statistica,'S')='S')
    and materie.cons_studi = 'S' AND materie.MATERIA_ESAME = 'S' and anagrafica_allievi.nazionalita='Z000'
    AND materie.TIPO_MATERIA = 'DU'
    ORDER BY descrizione_materia,cognome,DATA_INTERROGAZIONE desc ) as appo

    GROUP BY appo.codice_allievo,appo.codice_materia ORDER BY appo.descrizione_materia,appo.cognome_nome
Devi accedere o registrarti per scrivere nel forum
1 risposte