Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como fazer uma solicitação SQL usando CASE


Há tantas coisas erradas, é difícil saber por onde começar.

Você está misturando as duas formas de CASE expressão. Uma forma é:
CASE <expression>
    WHEN <value> THEN <result>
    WHEN <value> THEN <result>
    ...
END

o outro é:
CASE
    WHEN <condition> THEN <result>
    WHEN <condition> THEN <result>
    ...
END

Você está tentando usar um SELECT query como um valor, mas está faltando o FROM cláusula e você precisa envolver uma consulta entre parênteses para usá-la como um valor. Suspeito que você queria que isso fosse consultando na mesma tabela, nesse caso você não deveria estar fazendo uma subconsulta, você deveria apenas usar a função de agregação na consulta principal.

O CASE expressão deve fazer parte do SELECT lista, não após o FROM cláusula.

Se você deseja criar colunas separadas na saída para cada caso, elas não podem estar em um CASE expressão.

Você tem todos os nomes de suas tabelas e colunas entre aspas duplas, o MySQL usa acentos graves para citar nomes.

Você não precisa de SELECT DISTINCT ao usar GROUP BY .

Você não pode fazer referência a um alias no SELECT list na mesma consulta, exceto em GROUP BY , ORDER BY , e HAVING .

Deveria ser:
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