sql >> Databáze >  >> RDS >> Oracle

GROUP BY / zmatek agregačních funkcí v SQL

Ve standardním SQL (ale ne MySQL), když používáte GROUP BY, musíte v klauzuli GROUP BY uvést všechny sloupce výsledků, které nejsou agregované. Pokud tedy order_details má 6 sloupců, pak musíte uvést všech 6 sloupců (podle názvu – nelze použít * v klauzuli GROUP BY nebo ORDER BY) v klauzuli GROUP BY.

Můžete také:

SELECT order_no, SUM(order_price)
  FROM order_details
 GROUP BY order_no;

To bude fungovat, protože všechny neagregované sloupce jsou uvedeny v klauzuli GROUP BY.

Můžete udělat něco jako:

SELECT order_no, order_price, MAX(order_item)
  FROM order_details
 GROUP BY order_no, order_price;

Tento dotaz není ve skutečnosti smysluplný (nebo s největší pravděpodobností není smysluplný), ale bude „fungovat“. Uvede každé samostatné číslo objednávky a kombinaci ceny objednávky a uvede maximální položku (číslo) objednávky spojenou s touto cenou. Pokud mají všechny položky v objednávce odlišné ceny, skončíte se skupinami po jednom řádku. OTOH, pokud je v objednávce několik položek za stejnou cenu (řekněme 0,99 GBP za každou), pak je seskupí a vrátí maximální číslo položky objednávky za tuto cenu. (Předpokládám, že tabulka má primární klíč na (order_no, order_item) kde první položka v objednávce má order_item = 1 , druhá položka je 2 atd.)



  1. Techniky optimalizace dotazů v SQL Server:5 osvědčených postupů pro zvýšení výkonu dotazů

  2. Průvodce analýzou dat:Je čas vyniknout pomocí Excelu!

  3. MariaDB JSON_ARRAYAGG() Vysvětleno

  4. Jak používat UPDATE z SELECT v SQL Server