sql >> Databasteknik >  >> RDS >> Mysql

Hur man gör en SQL-förfrågan med CASE

Det är så många saker som är fel, det är svårt att veta var man ska börja.

Du blandar ihop de två formerna av CASE uttryck. Ett formulär är:

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

den andra är:

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

Du försöker använda en SELECT fråga som ett värde, men den saknar FROM och du måste linda en fråga inom parentes för att använda den som ett värde. Jag misstänker att du ville att det här skulle fråga från samma tabell, i så fall borde du inte göra en underfråga, du ska bara använda aggregeringsfunktionen i huvudfrågan.

CASE uttryck bör vara en del av SELECT lista, inte efter FROM klausul.

Om du vill skapa separata kolumner i utdata för varje fall kan de inte vara i ett CASE uttryck.

Du har alla dina tabell- och kolumnnamn inom dubbla citattecken, MySQL använder backticks för att citera namn.

Du behöver inte SELECT DISTINCT när du använder GROUP BY .

Du kan inte referera till ett alias i SELECT lista i samma fråga, utom i GROUP BY , ORDER BY , och HAVING .

Det ska vara:

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


  1. Oracle Database 20c Nya funktioner

  2. Hur återställer man data från en raderad Docker-behållare? Hur återansluter man den till data?

  3. Max storlek på UNIKT index i MySQL

  4. Hur man lagrar IPv6-kompatibel adress i en relationsdatabas