Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie man eine SQL-Anfrage mit CASE macht

Es sind so viele Dinge falsch, dass es schwer ist zu wissen, wo man anfangen soll.

Sie verwechseln die beiden Formen von CASE Ausdruck. Eine Form ist:

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

die andere ist:

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

Sie versuchen, ein SELECT zu verwenden Abfrage als Wert, aber es fehlt der FROM -Klausel und Sie müssen eine Abfrage in Klammern setzen, um sie als Wert zu verwenden. Ich vermute, Sie wollten, dass dies aus derselben Tabelle abgefragt wird. In diesem Fall sollten Sie keine Unterabfrage durchführen, sondern nur die Aggregationsfunktion in der Hauptabfrage verwenden.

Der CASE Ausdruck sollte Teil von SELECT sein Liste, nicht nach FROM Klausel.

Wenn Sie für jeden Fall separate Spalten in der Ausgabe erstellen möchten, können diese nicht in einem CASE sein Ausdruck.

Sie haben alle Ihre Tabellen- und Spaltennamen in doppelten Anführungszeichen, MySQL verwendet Backticks, um Namen in Anführungszeichen zu setzen.

Sie brauchen SELECT DISTINCT nicht bei Verwendung von GROUP BY .

Sie können in SELECT nicht auf einen Alias ​​verweisen Liste in derselben Abfrage, außer in GROUP BY , ORDER BY , und HAVING .

Es sollte sein:

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