2011-12-03 17 views
2

各注文について、商品の合計額と合計支払い額がバランスを取るようにしたいと考えています。MySql:異なるテーブルからSUM値を取得するには?

これは、テーブルの縮小版である:

ORDERS 
-------------------- 
|ord_id|customer_id| 
-------------------- 
|  1|  XYZ| 
|  .|   .| 
|  .|   .| 
|  .|   .| 
-------------------- 

ORDER_DETAILS 
----------------------------------------- 
|det_id|ord_id|product_id|quantity|price| 
----------------------------------------- 
|  1|  1| AAA001|  3| 30| 
|  2|  1| BBB002|  2| 5| 
|  .|  .|   .|  .| .| 
|  .|  .|   .|  .| .| 
|  .|  .|   .|  .| .| 
----------------------------------------- 

PAYMENTS 
---------------------- 
|pay_id|ord_id|amount| 
---------------------- 
|  1|  1| 10| 
|  2|  1| 20| 
|  3|  1| 10| 
|  .|  .|  .| 
|  .|  .|  .| 
|  .|  .|  .| 
---------------------- 

このクエリは、製品のカウントが支払いのカウントのために同じであるときの支払いのための正しい値を取得するだけで、支払いのための正しい値を返しません。

SELECT o.ord_id, SUM(quantity * price) AS total_order, SUM(amount) AS total_payments 
FROM orders AS o 
INNER JOIN order_details AS d ON o.ord_id = d.ord_id 
INNER JOIN payments AS p ON o.ord_id = p.ord_id 
GROUP BY o.ord_id 

これは期待された結果である:

----------------------------------- 
|ord_id|total_order|total_payments| 
----------------------------------- 
|  1|  100|   40| 
|  .|   .|    .| 
|  .|   .|    .| 
|  .|   .|    .| 
----------------------------------- 

おかげで、私はn進める。

答えて

6

別に2つのクエリを実行し、結果を結合します。私には、論理的にはるかに意味になりその:

SELECT 
    ot.ord_id, 
    ot.order_total, 
    op.order_paid 
FROM 
    (
     SELECT 
      ord_id, 
      SUM(price * quantity) AS order_total 
     FROM 
      ORDER_DETAILS 
     GROUP BY 
      ord_id 
    ) AS ot 
    INNER JOIN (
     SELECT 
      ord_id, 
      SUM(amount) AS order_paid 
     FROM 
      PAYMENTS 
     GROUP BY 
      ord_id 
    ) AS op ON (op.ord_id = ot.ord_id) 
; 

を...

ord_id | order_total | order_paid 
--------+-------------+------------ 
     1 |   100 |   40 
(1 row) 
0

det_idWITH ROLLUP句でグループ化してみてください。

SELECT o.ord_id, SUM(quantity * price) AS total_order, SUM(amount) AS total_payments 
FROM orders AS o 
INNER JOIN order_details AS d ON o.ord_id = d.ord_id 
INNER JOIN payments AS p ON o.ord_id = p.ord_id 
GROUP BY o.ord_id, o.det_id WITH ROLLUP 
+0

私はWITH修飾子(:5.1.41 MySQLバージョン)で構文エラーを取得しています。私はドキュメンテーション(http://dev.mysql.com/doc/refman/5.0/ja/group-by-modifiers.html)をチェックしますが、正しい句が表示されます。 – Leonardo

関連する問題