2012-04-06 22 views
0

1対多関係の2つのテーブル(orders、order_lines)があります。 orders表には1つの行があり、order_lines表にはその注文に添付された各製品ごとに1つの行があります。私はORDER_LINESテーブルにtotal_orderに& shipping_total ORDERS表の列とボリューム&価格の列を合計したい異なるテーブルの複数の列を合計するMYSQLクエリ

ORDERS

+----------+-------------+---------------+ 
    |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 | 
    +----------+-------------+-------+ 

。現在動作していない

問合せ:

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

総額または総額を指定しますか?注文またはPR。国? – barsju

+0

結合によって生成された中間テーブルは、total_orderおよびshipping_totalにそれぞれ同じ値を持つ3つの行を作成します。だからあなたのSUM()はこれらの量を3倍にカウントしますが、正しい量の合計を返します。このような価格を追加することは私には意味がありません。一般的に、同じクエリ内のヘッダテーブル(ORDERS)とディテールテーブル(ORDER_LINES)の間でSUM()を実行する必要はありません。 –

+0

ああ、私はその価格が私がextended_priceと呼ぶものだと思っています。それは私が見ることができないボリューム*単価の列です。 –

答えて

3

集計関数行SUMを使用する場合は、和を実行するために使用する列をGROUP BYにSQLサーバーに伝える必要があります。

あなたは、クエリの下に以下を追加した場合ので:

GROUP BY 
    b_orders.bill_country, b_orders.ship_country 

これは、あなたのデータでbill_country, ship_countryの一意の組合せごとの合計を与えるためにそれを教えてくれます。これはあなたが探しているものですか?

0

SUMのような集計関数を持つクエリにbill_countryとship_countryを含める場合は、それらをグループ化する必要があります。私はあなたが必要とするすべては終わりに次の行を追加することである疑いがある:

GROUP BY b_orders.bill_country, b_orders.ship_country; 

あなたがそれらを参照する必要がない場合、あなたは、SELECT文から削除し、グループ化を省略することができます。 WHERE句に含める列を選択する必要はありません。

関連する問題