sql >> Databáze >  >> RDS >> Mysql

Jak provést požadavek SQL pomocí CASE

Je tam tolik věcí špatně, že je těžké vědět, kde začít.

Pletete si dvě formy CASE výraz. Jedna forma je:

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

druhý je:

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

Pokoušíte se použít SELECT dotaz jako hodnotu, ale chybí v něm FROM klauzule a musíte zabalit dotaz do závorek, abyste jej mohli použít jako hodnotu. Mám podezření, že jste chtěli, aby to bylo dotazování ze stejné tabulky, v takovém případě byste neměli provádět poddotaz, měli byste pouze použít funkci agregace v hlavním dotazu.

CASE výraz by měl být součástí SELECT seznam, nikoli za FROM doložka.

Pokud chcete ve výstupu pro každý případ vytvořit samostatné sloupce, nemohou být v jednom CASE výraz.

Všechny názvy tabulek a sloupců máte ve dvojitých uvozovkách, MySQL používá k uvozování názvů zpětné zaškrtnutí.

Nepotřebujete SELECT DISTINCT při použití GROUP BY .

V SELECT nemůžete odkazovat na alias seznam ve stejném dotazu, kromě GROUP BY , ORDER BY a HAVING .

Mělo by to být:

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. Existuje optimální metoda pro objednání složeného indexu MySQL?

  2. Automatické doplňování v MySQL pod Windows

  3. Získání posledního vloženého ID s výrazem v mysql

  4. MySQL NAČTE DATA LOKÁLNÍ VSTUPNÍ SOUBOR Python