4

これが本当に基本的なものである場合は申し訳ありませんが、次のとおりです。

以前はまったく別のことをしていたか、構文がステップをスキップしたかのどちらかです。

たとえば、特定のデータを含むすべての行と、それらの列の合計を含む別の列を返す必要があるクエリがあります。期待どおりに動作する場合、次のようになります。

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

そして、注文のすべての行を取得し、それぞれの最後に合計を追加します。合計が毎回同じになることはわかっていますが、それは予想されることです。今それを機能させるために、私は使用しています:

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

基本的に、合計に対して 1 回、他のデータに対して 1 回、合計 2 回、同じクエリを実行します。しかし、たとえば、SUM と平均コストが必要な場合、同じクエリを 3 回実行することになります。これは本当に間違っているように思えます。間違い。

どんな助けでも本当に感謝しています。

4

1 に答える 1

7

GROUP BY目的の結果を得るには、そのまま使用する必要があります。

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

これにより、結果がグループ化されます。order_idandpart_idは複合 PK であると想定しているためSUM(cost)、上記ではおそらくそうであることに注意してください= cost(一意であることが保証されている 2 つのフィールドの組み合わせによるグループ化のためです。以下の相関サブクエリはこの制限を克服します)。

フェッチされた非集計行は行で指定する必要がありますGROUP BY

詳細については、次のチュートリアルを参照してGROUP BYください。

MySQL チュートリアル - グループ化


編集:列を集計と非集計の両方として使用する場合、またはグループの分離を解除する必要がある場合は、サブクエリを次のように使用する必要があります。

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
于 2009-07-28T05:09:12.147 に答える