Oracle
 sql >> Datenbank >  >> RDS >> Oracle

GROUP BY / Aggregatfunktionsverwirrung in SQL

Wenn Sie in Standard-SQL (aber nicht in MySQL) GROUP BY verwenden, müssen Sie alle Ergebnisspalten, die keine Aggregate sind, in der GROUP BY-Klausel auflisten. Wenn also order_details 6 Spalten hat, müssen Sie alle 6 Spalten auflisten (nach Namen - Sie können * nicht verwenden in der GROUP BY- oder ORDER BY-Klausel) in der GROUP BY-Klausel.

Sie können auch Folgendes tun:

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

Das funktioniert, weil alle nicht aggregierten Spalten in der GROUP BY-Klausel aufgeführt sind.

Sie könnten so etwas tun:

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

Diese Abfrage ist nicht wirklich aussagekräftig (oder höchstwahrscheinlich nicht aussagekräftig), aber sie wird 'funktionieren'. Es listet jede einzelne Kombination aus Bestellnummer und Bestellpreis auf und gibt die maximale Bestellposition (Nummer) an, die diesem Preis zugeordnet ist. Wenn alle Artikel in einer Bestellung unterschiedliche Preise haben, erhalten Sie am Ende Gruppen von jeweils einer Zeile. OTOH, wenn die Bestellung mehrere Artikel zum gleichen Preis enthält (z. B. 0,99 £ pro Stück), werden diese zusammengefasst und die maximale Bestellartikelnummer zu diesem Preis zurückgegeben. (Ich gehe davon aus, dass die Tabelle einen Primärschlüssel für (order_no, order_item) hat wobei der erste Artikel in der Bestellung order_item = 1 hat , das zweite Element ist 2 usw.)