2012-11-28 153 views
1

我正在使用以下查詢獲取一些銷售數據。問題是它返回了錯誤的數據。使用SQL Server 2008連接表問題

我在一起加了三張表tbl_orderstbl_orderitemstbl_paymenttbl_orders表包含彙總信息,tbl_orderitems包含訂購的物品,tbl_payment表包含有關訂單的付款信息。可以對每個訂單進行多次付款。

我想獲得項目sum(mon_orditems_pprice)的總和,以及銷售項目的數量count(uid_orderitems)

當我運行以下查詢對特定訂單號,我知道有一個訂單項。它返回2的計數和兩個項目的總和。

Item      ProdTotal ProdCount 
Westvale Climbing Frame 1198   2 

這項命令在tbl_payment表,這是造成雙計數舉行了兩次付款記錄。如果我刪除了付款表,那麼它會報告正確的數字,或者如果我選擇了具有單一付款的訂單,它也會起作用。我錯過了什麼,我很累!!

SELECT 
    txt_orditems_pname, 
    SUM(mon_orditems_pprice) AS prodTotal, 
    COUNT(uid_orderitems) AS prodCount 
FROM dbo.tbl_orders 
    INNER JOIN dbo.tbl_orderitems ON (dbo.tbl_orders.uid_orders = dbo.tbl_orderitems.uid_orditems_orderid) 
    INNER JOIN dbo.tbl_payment ON (dbo.tbl_orders.uid_orders = dbo.tbl_payment.uid_pay_orderid) 
WHERE 
    uid_orditems_orderid = 61571 
GROUP BY 
    dbo.tbl_orderitems.txt_orditems_pname 
ORDER BY 
    dbo.tbl_orderitems.txt_orditems_pname 

有什麼建議嗎?

謝謝。

下鑽表列

dbo.tbl_payment.bit_pay_paid (1/0) Has this payment been paid, yes no 
dbo.tbl_orders.bit_order_archive (1/0) Is this order archived, yes no 
dbo.tbl_orders.uid_order_webid (integer) Web Shop's ID 
dbo.tbl_orders.bit_order_preorder (1/0) Is this a pre-order, yes no 
YEAR(dbo.tbl_orders.dte_order_stamp) (2012) Sales year 
dbo.tbl_orders.txt_order_status (varchar) Is the order dispatched, awaiting delivery 
dbo.tbl_orderitems.uid_orditems_pcatid (integer) Product category ID 

回答

1

這是一種正常的行爲,如果您刪除分組節你會發現真的有加盟後2行,他們都有599作爲mon_orditems_pprice因此SUM是正確的。當任何連接表中存在多重匹配時,整個輸出行將變爲多個,並且正在求和(或以任何其他方式進行計數或聚合)的數據也會被求和多次。試試這個:

SELECT  txt_orditems_pname, 
      SUM(mon_orditems_pprice) AS prodTotal, 
      COUNT(uid_orderitems) AS prodCount 
FROM  dbo.tbl_orders 
INNER JOIN dbo.tbl_orderitems ON (dbo.tbl_orders.uid_orders = dbo.tbl_orderitems.uid_orditems_orderid) 
INNER JOIN 
(
    SELECT x.uid_pay_orderid 
    FROM dbo.tbl_payment x 
    GROUP BY x.uid_pay_orderid 
) AS payments ON (dbo.tbl_orders.uid_orders = payments.uid_pay_orderid) 

WHERE 
    uid_orditems_orderid = 61571 
GROUP BY 
    dbo.tbl_orderitems.txt_orditems_pname 
ORDER BY 
    dbo.tbl_orderitems.txt_orditems_pname 

我不知道你正在使用從tbl_payment什麼數據,是任何列從tbl_payment實際上SELECT列表?爲什麼tbl_payment被加入?

+0

感謝您的回覆,mon_orditems_pprice來自'tbl_orditems'表。謝謝你的領導,雖然我會調整並報告回來。 –

+0

您好Ivan,我正在使用付款表來深入瞭解哪些數據將包含在where語句中。 –

+0

嗨,Jason。我在查詢中編寫它的方式不會再導致多行,但它也沒用(沒有數據或過濾正在執行,只是加入)。嘗試給出一個例子,你需要什麼樣的數據或從'tbl_payments'過濾... –