3

たった 1 つの SQL クエリで 5 つの異なるテーブルの結果の合計を取得しようとしています。5 つのテーブルがあり、各テーブルには注文に属するレコードが含まれている可能性があります。5 つのテーブルのすべてのレコードの合計によって、合計注文価格が決まります。

このフォーラムで検索すると、次のクエリが思いつきました。

SELECT
  OrderTotal.total + Shipping.amount + Service.amount - Gift.amount - RMA.total as TotalCosts
FROM
  (SELECT SUM(price * amount) AS total FROM order WHERE order_id=123456) OrderTotal
  (SELECT amount FROM shipping WHERE order_id=123456) Shipping,
  (SELECT amount FROM service WHERE order_id=123456) Service,
  (SELECT SUM(price * amount) AS total FROM rma WHERE order_id=123456) RMA,
  (SELECT amount FROM gift WHERE order_id=123456) Gift

私が今直面している問題は、たとえば最後の SELECT が 0 行を返すと、TotalCosts の合計が返されないことです。

これを解決するには?

4

2 に答える 2

1

を使用してはUNIONどうですか?

SELECT  order_id, SUM(total) GrandTotal
FROM
        (
            SELECT  order_id, SUM(price * amount) AS total 
            FROM    `order` 
            WHERE   order_id = 123456
            UNION ALL
            SELECT  order_id, amount AS total 
            FROM    shipping 
            WHERE   order_id = 123456
            UNION ALL
            SELECT  order_id, amount AS total 
            FROM    service 
            WHERE order_id = 123456
            UNION ALL
            SELECT  order_id, SUM(price * amount) AS total 
            FROM    rma 
            WHERE   order_id = 123456
            UNION ALL
            SELECT  order_id, amount AS total 
            FROM    gift 
            WHERE   order_id=123456
        ) subTable
GROUP   BY order_id
于 2013-03-11T16:07:57.223 に答える
0

IFNULL関数を使用して解決できます

SELECT
  IFNULL(OrderTotal.total,0) + IFNULL(Shipping.amount + IFNULL(Service.amount - IFNULL(Gift.amount,0) - RMA.total as TotalCosts
FROM
  (SELECT SUM(price * amount) AS total FROM order WHERE order_id=123456) OrderTotal
  (SELECT amount FROM shipping WHERE order_id=123456) Shipping,
  (SELECT amount FROM service WHERE order_id=123456) Service,
  (SELECT SUM(price * amount) AS total FROM rma WHERE order_id=123456) RMA,
  (SELECT amount FROM gift WHERE order_id=123456) Gift
于 2013-03-11T16:48:33.667 に答える