Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment faire une requête SQL en utilisant CASE

Il y a tellement de choses qui ne vont pas qu'il est difficile de savoir par où commencer.

Vous mélangez les deux formes de CASE expression. Un formulaire est :

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

l'autre est :

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

Vous essayez d'utiliser un SELECT requête en tant que valeur, mais il manque le FROM clause et vous devez envelopper une requête entre parenthèses pour l'utiliser comme valeur. Je suppose que vous vouliez que cela interroge à partir de la même table, auquel cas vous ne devriez pas faire de sous-requête, vous devez simplement utiliser la fonction d'agrégation dans la requête principale.

Le CASE l'expression doit faire partie du SELECT liste, pas après le FROM clause.

Si vous souhaitez créer des colonnes distinctes dans la sortie pour chaque cas, elles ne peuvent pas être dans un seul CASE expression.

Vous avez tous vos noms de table et de colonne entre guillemets doubles, MySQL utilise des backticks pour citer les noms.

Vous n'avez pas besoin de SELECT DISTINCT lors de l'utilisation de GROUP BY .

Vous ne pouvez pas faire référence à un alias dans le SELECT list dans la même requête, sauf dans GROUP BY , ORDER BY , et HAVING .

Cela devrait être :

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