Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: group by approfondito

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    180

    group by approfondito

    Ciao a tutti,
    ho bisogno di risolvere un problema di SQL, più approfondito del semplice GROUP BY, poichè ho bisogno di mantenere traccia di alcune informazioni.

    Vi illustro il problema:
    Ho dei records che sono identici tranne che per il valore in un campo, tipo:

    nome - cognome - citta - tipo
    aaa - bbb - ccc - tipo1
    aaa - bbb - ccc - tipo2
    aaa - bbb - ccc - tipo3

    vorrei poter "compattare" tali records in uno solo, che però riporti gli attributi di tutti, vorrei cioè:
    aaa - bbb - ccc - tipo1, tipo2, tipo3

    si può fare su un db MySQL?

    grazie

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    codice:
    select nome,cognome,tipo, group_concat(tipo) as elenco
    from tabella
    group by nome

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    180
    ...perfetto, funziona, ma la restituzione occupa un testo troppo lungo....

    come posso ottenere il conto delle tipologie, tipo così:
    aaa - bbb - ccc - 2xtipo1, 3xtipo2, 1xtipo3

    avevo provato COUNT(group_concat(tipo)) ma non funziona!

    grazie

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Le tipologie sono molte?

    edit. Avevo pensato a una cosa del genere:

    codice:
    select nome,concat_ws(',',tipo1,tipo2,tipo3) as resoconto from (
    select nome,
    concat('tipo1:',sum(if(tipo="tipo1",1,0))) as tipo1,
    concat('tipo2:',sum(if(tipo="tipo2",1,0))) as tipo2,
    concat('tipo3:',sum(if(tipo="tipo3",1,0))) as tipo3
    from tabella
    group by nome ) as tab

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    180
    No, le tipologie sono solo 4.

    Non ho capito il tuo esempio: hai messo una select dentro una select???

    grazie

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Se son solo 4 il mio esempio ti va benissimo. Si, ho usato le select annidate. Se hai almeno la versione 4.1 di mysql puoi utilizzarle.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    180
    ...allora siccome la query è complessa mi sto incasinando:
    pernsavo di semplificare così:
    CONCAT_WS(';',(sum(if(tipo="tipo1",1,0))), (sum(if(tipo="tipo2",1,0))), (sum(if(tipo="tipo3",1,0))), (sum(if(tipo="tipo4",1,0))) )AS tipologia

    e funziona, ma il campo "tipologia" mi restituisce (giustamente):
    1;2;0;0

    senza le intestazioni dei tipi prima del loro totale;
    vorrei inserire tipo1:1;tipo2:2;tipo3:0;tipo4:0 senza la doppia select

    grazie

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Non credo sia possibile senza la select annidata. La query che ti ho scritto fa esattamente ciò che hai chiesto. Se non hai problemi di versione di mysql usa quella.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    180
    Si, avevo provato, ma avevo errore; dice mancano le tabelle.
    Ma devo ripetere anche il FROM e GROUP BY principali, tipo così:

    select nome,concat_ws(',',tipo1,tipo2,tipo3) as resoconto
    from (
    select nome,
    concat('tipo1:',sum(if(tipo="tipo1",1,0))) as tipo1,
    concat('tipo2:',sum(if(tipo="tipo2",1,0))) as tipo2,
    concat('tipo3:',sum(if(tipo="tipo3",1,0))) as tipo3
    from tabella
    group by nome
    ) as tab

    from tabella
    group by nome


    grazie

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Per il problema che hai posto non devi ripetere niente, basta così

    codice:
    select nome,concat_ws(',',tipo1,tipo2,tipo3) as resoconto
    from (
    select nome,
    concat('tipo1:',sum(if(tipo="tipo1",1,0))) as tipo1,
    concat('tipo2:',sum(if(tipo="tipo2",1,0))) as tipo2,
    concat('tipo3:',sum(if(tipo="tipo3",1,0))) as tipo3
    from tabella
    group by nome
    ) as tab

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.