Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [MySQL] CASE complesso

  1. #1

    [MySQL] CASE complesso

    Ciao Ragazzi, urge aiutino
    Sto impazzendo non riesco a capire come impostare una query ammesso che si possa strutturare per ottenere l'output che voglio, spiego;

    ho una tabella con un questionario (61 domande e conseguenti risposte con valori numerici; 0,1,2,3) ogni questionario è popolato da una station (centro operativo) quello che vorrei ottenere è un elenco che per ogni station mi proponga; quante risposte NULL, SI, NO, N/A sono presenti.

    La query qui postata funziona, il problema è che mi mostra (giustamente) solo le risposte valorizzate, invece io avrei bisogno che mi riproponga cmq tutte e 4 le tipologie di risposta; "NULL, SI, NO, N/A"
    con totali a zero (0) di quelle non presenti, spero di essere stato chiaro co

    Magari è più semplice di quanto sto cercando di capire, ma non mi viene proprio in mente come fare.

    codice:
    SELECT  
    CASE
        WHEN tb1.risposta = 0 THEN "NULL"
        WHEN tb1.risposta = 1 THEN "SI"
        WHEN tb1.risposta = 2 THEN "NO"
        WHEN tb1.risposta = 3 THEN "N/A" 
    END AS tipo_risposte,
    tb3.station_code_dom as station,
    CASE
        WHEN tb1.risposta = 0 THEN SUM(IF(tb1.risposta = 0,1,0))
        WHEN tb1.risposta = 1 THEN SUM(IF(tb1.risposta = 1,1,0))
        WHEN tb1.risposta = 2 THEN SUM(IF(tb1.risposta = 2,1,0))
        WHEN tb1.risposta = 3 THEN SUM(IF(tb1.risposta = 3,1,0))  
    END AS totali_risposte                           
    FROM sa_mf_domande AS tb1
    JOIN sa_schede AS tb2 ON tb2.pid_scheda = tb1.pid_scheda
    JOIN v_full_organization AS tb3 ON tb3.pid_station = tb2.pid_station                                               
    GROUP BY tb1.risposta, station 
    ORDER BY tb1.risposta ASC

  2. #2

  3. #3
    Quote Originariamente inviata da optime Visualizza il messaggio
    fa' un esempio pls
    Ci provo...
    la mia query mi restituisce (correttamente) il seguente output.

    risposta station totali
    NULL APR 61
    NULL AQ 61
    NULL BS 61
    NULL BUS 61
    NULL BZ 61
    SI AG 61
    SI AL 37
    SI AN 48
    SI AO 58
    NO AL 13
    NO AN 10
    NO AO 2
    N/A AL 11
    N/A AN 3
    N/A AO 1


    Ovvero, ogni questionario � formato da 61 domande, che devono essere tutte valorizzate, i 61 campi NULL vuol dire che quelle station ancora non hanno gestito neanche una domanda.
    Per esempio; la station di AN ha completato il questionario tutte le 61 domande; 48 (SI), 10 (NO) e 3 (N/A) totale 61

    Adesso quello che mi serve per renderizzare correttamente un grafico � avere cmq il valore a zero del tipo risposte non presenti di ogni station, cio� visto che AN ha completato tutto e di NULL ovviamente non ce ne sono, dovrei stampare anche il totale dei NULL, ed avere quindi un output del genere;

    risposta station totali
    NULL APR 61
    NULL AQ 61
    NULL BS 61
    NULL BUS 61
    NULL BZ 61
    NULL AG 0
    NULL AL 0
    NULL AN 0
    NULL AO 0
    SI APR 0
    SI AQ 0
    SI BS 0
    SI BUS 0
    SI BZ 0
    SI AG 61
    SI AL 37
    SI AN 48
    SI AO 58
    NO AL 13
    NO AN 10
    NO AO 2
    NO APR 0
    NO AQ 0
    NO BS 0
    NO BUS 0
    NO BZ 0
    N/A AL 11
    N/A AN 3
    N/A AO 1
    N/A APR 0
    N/A AQ 0
    N/A BS 0
    N/A BUS 0
    N/A BZ 0


    Spero di essere stato più chiaro. Grazie mille

  4. #4
    Ciao,
    cio� detto in altre parole ,
    data una station e tutti i possibili tipi di risposte ( NULL, SI, NO, N/A )
    avere il valore per ogni tipo delle possibili risposte anche se mai date per quella station ... giusto ?

    ad occhio direi allora che qualche tabella ( ma non capisco quale)
    vada combinata in cross join con tutti i possibili tipi di risposte
    e poi messa in left join con le altre.

    Penso che sarebbe buona cosa un esempio su http://sqlfiddle.com
    con le create table ed insert into congruente con il risultato desiderato
    ( ... anche meno dati ... basta inserirne pochi ma significativi)

    HTH

    Ultima modifica di sspintux; 13-01-2021 a 22:06
    O santo protettore del'informatico quadratico medio , se puoi allontana da me questo cetriolo amaro!
    Programmazione agile ? Guarda che qua già da un pezzo facciamo programmazione acrobatica !

  5. #5
    .
    Ultima modifica di optime; 14-01-2021 a 11:33

  6. #6
    SELECT * FROM tabella_risposte_possibili T1 LEFT JOIN (tua query) T2 ON T1.risposta_possibile=risposta

    qualcosa del genere

    tabella_risposte_possibili conterrà
    SI
    NO
    N/A
    NULL <-- questo è un problema... devi usare "NULL" come stringa, ma la tua query deve estrarre anche lei "NULL" come stringa, quindi devi usare ISNULL()

  7. #7
    Grazie a tutti !!
    Ho risolto facendo così; mi sono creato 4 views ognuna per calcolare singolarmente le tipologie di risposte (NULL, SI, NO, N/A)
    Applicando degli IF per rilevare la mancanza di tipo risposte.
    Poi ho messo insieme le views tramite UNION in un unica view riepilogativa (ovviamente potevo usare anche una query, ma così è più comodo)

    Grazie ancora per la vs collaborazione !

  8. #8
    posta la soluzione, grazie!

  9. #9
    Ho creato una vista per ogni tipo risposta

    codice:
    CREATE VIEW v_risposte_0 AS
    SELECT
    "NULL" AS tipo_risposta,
    tb2.station,
    IF(SUM(IF(tb3.risposta = 0,1,0)) < 1 OR tb3.risposta IS NULL,0,SUM(IF(tb3.risposta = 0,1,0))) AS totali                        
    FROM questionari AS tb1
    JOIN station AS tb2 ON tb2.id_station = tb1.id_station  
    LEFT JOIN sa_mf_domande AS tb3 ON tb3.pid_scheda = tb1.pid_scheda AND tb3.risposta = 0                                             
    GROUP BY tb1.pid_station
    Poi ho messo insieme le 4 views tramite UNION per ottenere la mia view riepilogativa (v_all_risposte) avendo una tabella pronta all'uso

    codice:
    CREATE VIEW v_all_risposte AS
    SELECT * FROM v_risposte_0
    UNION
    SELECT * FROM v_risposte_1
    UNION
    SELECT * FROM v_risposte_2
    UNION
    SELECT * FROM v_risposte_3
    Grazie

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.