sql >> Base de Datos >  >> RDS >> Mysql

Cómo hacer una solicitud SQL usando CASE

Hay tantas cosas mal que es difícil saber por dónde empezar.

Estás mezclando las dos formas de CASE expresión. Una forma es:

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

el otro es:

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

Estás intentando usar un SELECT consulta como un valor, pero falta el FROM cláusula y debe envolver una consulta entre paréntesis para usarla como valor. Sospecho que quería que esto se consultara desde la misma tabla, en cuyo caso no debería estar haciendo una subconsulta, solo debería usar la función de agregación en la consulta principal.

El CASE expresión debe ser parte de SELECT lista, no después del FROM cláusula.

Si desea crear columnas separadas en la salida para cada caso, no pueden estar en un CASE expresión.

Tiene todos los nombres de sus tablas y columnas entre comillas dobles, MySQL usa acentos graves para citar nombres.

No necesitas SELECT DISTINCT al usar GROUP BY .

No puede hacer referencia a un alias en el SELECT list en la misma consulta, excepto en GROUP BY , ORDER BY , y HAVING .

Debería 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