2015-09-27 74 views
1

美好的一天,與連接mysql查詢的結果有問題,並選擇

我想加入3表我的庫存報告,但我越來越奇怪的結果。

我的查詢

SELECT i_inventory.xid, 
     count(x_transaction_details.xitem) AS occurrence, 
     i_inventory.xitem AS itemName, 
     SUM(i_items_group.or_qty) AS `openingQty`, 
     avg(x_transaction_details.cost) AS avg_cost, 
     SUM(x_transaction_details.qty) AS totalNumberSold, 
     SUM(i_items_group.or_qty) - SUM(x_transaction_details.qty) AS totalRemQty 
FROM x_transaction_details 
LEFT JOIN i_inventory ON x_transaction_details.xitem = i_inventory.xid 
LEFT JOIN i_items_group ON i_inventory.xid = i_items_group.xitem 
WHERE (x_transaction_details.date_at BETWEEN '2015-01-18 03:14:54' AND '2015-10-18 03:14:54') 
    AND i_inventory.xid = 3840 
GROUP BY x_transaction_details.xitem 
ORDER BY occurrence DESC 

該查詢給了我這樣的結果: enter image description here

openingQty列,然後我試圖做一個簡單的查詢來驗證結果,

這裏是我的查詢僅加入2個表i_items_group表(存儲批次)和i_inventory表(存儲項目信息)時檢查開標數量。

SELECT i_inventory.xid, 
     i_inventory.xitem, 
     SUM(i_items_group.or_qty) AS openingQty, 
     i_items_group.cost 
FROM i_inventory 
INNER JOIN i_items_group ON i_inventory.xid = i_items_group.xitem 
WHERE i_inventory.xid = 3840 
    AND (i_items_group.date_at BETWEEN '2015-01-18 03:14:54' AND '2015-10-18 03:14:54') 

我的結果是:

enter image description here

這是正確的數據。

我也對我的x_transaction_details表做過查詢,以驗證它的正確與否。

繼承人我查詢:

select xitem, qty as qtySold from x_transaction_details where xitem = 3840 
AND (date_at BETWEEN '2015-01-18 03:14:54' AND '2015-10-18 03:14:54') 

結果:

enter image description here

這將總量達到:15 quatitySold。

我對我怎麼拿到3269作爲我查詢的結果,其中作爲真正openingQty應該只有467

我想這個問題是我的查詢與連接,它搞亂只有迷茫然後總結交易數量(雖然我真的不知道)。

你能幫我辨認嗎,並幫我拿出正確的查詢。

+1

它會幫助,如果你可以成立一個小提琴問題 –

+0

好吧@vkp我會盡力做到這一點..我不知道如何做到這一點,雖然xD喜歡如何創建一個表.. – melvnberd

回答

1

這是單個查詢中多個SUM語句的常見問題。請記住SQL如何進行聚合:首先它會生成一組未聚合的數據,然後聚合它。在沒有GROUP BY或聚合函數的情況下嘗試查詢,你會驚訝你發現了什麼。我的帖子中沒有足夠的正確詳細信息來確定細分的位置,但我可以猜測。

它看起來像你有一種xitem對應於某種產品,那麼你已經加入到交易和物品組。假設一個特定的xitem與3個交易和5個物品組匹配。您將從該連接中獲得15條記錄。總結時,基於交易表中字段的任何SUM計算將比您預期的高出5倍,並且來自項目組表的任何SUM計算將比您預期的要高3倍。這裏的關鍵症狀是聚合結果是正確值的倍數,但對於不同行看似不同的倍數。

有多種方法可以解決這種錯誤。一些開發人員喜歡計算子查詢中的一個聚合,然後在主查詢中進行其他聚合,並通過子查詢中已經正確的結果進行分組。其他人喜歡寫內嵌查詢來表達聚合權:

SELECT xitem, (SELECT SUM(i_items_group.or_qty) FROM i_items_group WHERE i_inventory.xid = i_items_group.xitem) AS `openingQty` 
, -- select more fields 

找到最適合您的方法。但是,如果你想看到的證據爲自己,運行此查詢與骨料走了,你就會明白爲什麼那些和數是做他們正在做什麼:

SELECT i_inventory.xid, 
     x_transaction_details.xitem AS occurrence, 
     i_inventory.xitem AS itemName, 
     i_items_group.or_qty, 
     x_transaction_details.cost, 
     x_transaction_details.qty, 
     i_items_group.or_qty - x_transaction_details.qty AS RemainingQty 
FROM x_transaction_details 
LEFT JOIN i_inventory ON x_transaction_details.xitem = i_inventory.xid 
LEFT JOIN i_items_group ON i_inventory.xid = i_items_group.xitem 
WHERE (x_transaction_details.date_at BETWEEN '2015-01-18 03:14:54' AND '2015-10-18 03:14:54') 
    AND i_inventory.xid = 3840 

ORDER BY occurrence DESC 
+0

你絕對正確的先生@theTTGGuy ...我試着創建一個小提琴,但是,它似乎很複雜,因爲我有很多列在每個表中..我也研究過這樣的問題,現在我只是研究如何將它應用於我自己的查詢..非常感謝詳細的答案先生..它幫助我瞭解問題,並有更多的搜索鍵使用:) – melvnberd