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

Geben aggregierte MySQL-Funktionen immer eine einzelne Zeile zurück?

Sie müssen GROUP BY verwenden als solches, um das gewünschte Ergebnis zu erhalten:

SELECT
order_id,
part_id,
SUM(cost) AS total
FROM orders 
WHERE order_date BETWEEN xxx AND yyy
GROUP BY order_id, part_id

Dadurch werden Ihre Ergebnisse gruppiert. Beachten Sie, dass, da ich diese order_id annehme und part_id ist ein zusammengesetzter PK, SUM(cost) oben steht wahrscheinlich = cost (da Sie eine Gruppierung durch eine Kombination von zwei Feldern haben, die garantiert eindeutig ist. Die korrelierte Unterabfrage unten wird diese Einschränkung überwinden).

Alle abgerufenen nicht aggregierten Zeilen müssen in GROUP BY angegeben werden Zeile.

Weitere Informationen finden Sie in einem Tutorial zu GROUP BY hier:

BEARBEITEN: Wenn Sie eine Spalte sowohl aggregiert als auch nicht aggregiert verwenden möchten oder Ihre Gruppen aufheben müssen, müssen Sie eine Unterabfrage als solche verwenden:

SELECT
or1.order_id,
or1.cost,
or1.part_id,
(
  SELECT SUM(cost)
  FROM orders or2
  WHERE or1.order_id = or2.order_id
  GROUP BY or2.order_id
) AS total
FROM orders or1
WHERE or1.order_date BETWEEN xxx AND yyy