Mysql
 sql >> Database >  >> RDS >> Mysql

Come eseguire una richiesta SQL utilizzando CASE

Ci sono così tante cose che non vanno, è difficile sapere da dove cominciare.

Stai confondendo le due forme di CASE espressione. Un modulo è:

CASE <expression>
    WHEN <value> THEN <result>
    WHEN <value> THEN <result>
    ...
END

l'altro è:

CASE
    WHEN <condition> THEN <result>
    WHEN <condition> THEN <result>
    ...
END

Stai cercando di utilizzare un SELECT query come valore, ma manca il FROM clausola e devi racchiudere una query tra parentesi per usarla come valore. Sospetto che tu volessi che questa interrogasse dalla stessa tabella, nel qual caso non dovresti fare una sottoquery, dovresti semplicemente usare la funzione di aggregazione nella query principale.

Il CASE l'espressione dovrebbe far parte di SELECT elenco, non dopo il FROM clausola.

Se desideri creare colonne separate nell'output per ogni caso, non possono trovarsi in un CASE espressione.

Hai tutti i nomi delle tabelle e delle colonne tra virgolette doppie, MySQL usa i backtick per citare i nomi.

Non hai bisogno di SELECT DISTINCT quando si utilizza GROUP BY .

Non puoi fare riferimento a un alias in SELECT list nella stessa query, eccetto in GROUP BY , ORDER BY e HAVING .

Dovrebbe essere:

SELECT MONTH(Facturation) AS month, LRU, Client,
    AVG(CASE WHEN MONTH(Factuation) = 1 AND Facturation BETWEEN 1 AND 6
        THEN Montant_fac_eur END) AS c1,
    AVG(CASE WHEN MONTH(Factuation) = 2 AND Facturation BETWEEN 2 AND 7
        THEN Montant_fac_eur END) AS c2,
    AVG(CASE WHEN MONTH(Factuation) = 3 AND Facturation BETWEEN 3 AND 8
        THEN Montant_fac_eur END) AS c3,
    AVG(CASE WHEN MONTH(Factuation) = 4 AND Facturation BETWEEN 4 AND 9
        THEN Montant_fac_eur END) AS c4,
    ...
FROM foundry_sync.data
GROUP BY `LRU`, `Client`, `Facturation`
ORDER BY Client, month