2012-04-06 356 views
0

我有兩個表(orders,order_lines)和一對多關係。訂單表中將有一行,order_lines表將爲每個附加到訂單的產品分配一行。MYSQL查詢將不同表中的多個列相加

訂單

+----------+-------------+---------------+ 
    |order_num | total_order | shipping_total| 
    +----------+-------------+---------------+ 
    | 12345 | 75.00  | 15.00   | 
    +----------+-------------+---------------+ 

ORDER_LINES

+----------+-------------+-------+ 
    | order_num| volume  | price | 
    +----------+-------------+-------+ 
    | 12345 |10   |25.00 | 
    +----------+-------------+-------+ 
    | 12345 |20   |25.00 | 
    +----------+-------------+-------+ 
    | 12345 |20   |25.00 | 
    +----------+-------------+-------+ 

我想總結的total_order在Orders表& shipping_total列和體積&價格列在表ORDER_LINES。

查詢目前沒有工作:

SELECT b_orders.bill_country, b_orders.ship_country 
    , SUM(volume) AS v, SUM(price) AS pt 
    , SUM(shipping_total) AS st, SUM(total_order) AS tot_o 
FROM b_orders 
JOIN b_order_lines 
    ON b_orders.order_num = b_order_lines.order_num 
WHERE DATE(b_orders.order_date) BETWEEN '2012-04-02' AND '2012-04-06' 
    AND ship_country = 'USA' 
    AND b_order_lines.price > 0; 

該查詢返回錯誤的值。我有點知道爲什麼,但不知道如何編寫正確的查詢...請幫助。

+0

你想要總計還是公關。訂單或公關。國家? – barsju 2012-04-06 20:40:52

+0

由連接生成的中間表將創建三行,每行對total_order和shipping_total具有相同的值。因此,您的SUM()將對這些數量進行三重計數,但它會爲您提供正確的音量總和。把這樣的價格加起來對我來說沒有意義。通常,您不希望在同一查詢中通過頭表(ORDERS)和詳細表(ORDER_LINES)進行SUM()。 – 2012-04-06 20:47:29

+0

啊,我看到價格就是我所說的extended_price。這是我看不到的價格*單位價格欄。 – 2012-04-06 20:49:29

回答

3

當您使用聚合函數行SUM時,您需要告訴SQL服務器使用GROUP BY哪些列執行總和。

所以,如果你添加以下到您的查詢的底部:

GROUP BY 
    b_orders.bill_country, b_orders.ship_country 

這將告訴它給你的總和數據的bill_country, ship_country每個獨特組合。這是你想要的?

0

如果bill_country和ship_country將包含在同樣具有SUM這樣的聚合函數的查詢中,則需要對它們進行分組。我懷疑所有你需要的是在最後添加一行:

GROUP BY b_orders.bill_country, b_orders.ship_country; 

如果你不需要看到他們,你可以從SELECT語句刪除,並省略了分組;您不必選擇要將它們包含在WHERE子句中的列。

相關問題