2013-03-04 57 views
0

我在我的數據庫中的兩個表:與每個項目的當前價格每小時採購物料如何返回所有行從一個表中返回值,如果不存在返回0?

Item | Qnt | Rate |Total 
Meat | 1 | 20 | 20 
Fish | 0.5 | 30 | 15 
Chicken|1 | 25 | 25 
Meat | 2 | 20 | 40 


Table2: Trading Price 
Item |  Datetime  | Price 
Meat | 2013-02-20 10:00:00 | 20 
Meat | 2013-02-20 09:00:00 | 18 
Meat | 2013-02-19 08:00:00 | 21 
Fish | 2013-02-19 09:00:00 | 15 
Fish | 2013-02-19 08:00:00 | 17 
Chicken|2013-02-20 09:00:00|26 
Chicken|2013-02-20 08:00:00|25 

的表1列出了購買的物品和表2更新:

表1。所以從表2可以清楚地看出,肉類最後一次交易的時間是2013年2月20日上午10點。魚類沒有在當天交易,它於19-02-2013上午9點交易,雞肉交易於2013年2月20日上午9點。我想做的事情,列出從表1中的所有項目,並加入從表2的各個項目的最後交易價格將喜歡這樣的內容:

Output: 
Item | Qty | Total | Last Trade Price 
Meat | 1 | 20 | 20 
Meat | 2 | 40 | 20 
Fish | 0.5 |15  | 15 
Chicken|1 |25  |26 

什麼類型的連接,哪些條款應在此應用,以獲得理想的輸出? 我試過這個查詢: SELECT p.Item,p.Qnt l.price FROM Table1 as p INNER JOIN Table2 as l ON p.Item = l.Item WHERE l.Datetime =(SELECT max(Datetime)FROM Table2) ; 但通過這個查詢,我沒有找到所需的結果,因爲每個項目的最大日期時間不相同,這就是項目從輸出中缺失的原因。

那麼在WHERE子句中應該應用什麼聯接類型和條件來獲得上述輸出?

回答

0

嘗試此查詢:

SELECT p.Item, p.Qnt, LatestPriceTable.price FROM Table1 as p 

INNER JOIN 

(SELECT Table2.Item, Table2.Price FROM Table2 INNER JOIN 
(SELECT Item, MAX(DateTime) FROM Table2 
GROUP BY Item) AS A ON Table2.Item = A.Item) AS LatestPriceTable 

ON p.Item=LatestPriceTable.Item 

內最查詢SELECT Item, MAX(DateTime) FROM Table2 GROUP BY Item將輸出中的是最新的DateTime每個Item。我們將這個結果稱爲A.現在我們將A和Table2結合起來得到最新日期的Price列值。生成的表名爲LatestPriceTable,將只包含項目名稱和最新價格。現在,您可以簡單地將它與Table1一起進行計算。

我的確有一種感覺,你設計的系統可能不夠好,無法達到你想要實現的目標。它是一種庫存類型的應用程序嗎?我看到的問題是,您總是將當前庫存量與最新市場價格相乘。實際上,股票幾乎總是包含不同日子和不同利率的購買。但是再次,我不確定你的確切目的,所以也許你可以接受你在做什麼。

+0

請您詳細解釋一下上面的代碼嗎? – stockBoi 2013-03-04 18:00:50

+0

@ user2132726:看看我上面的修改。 – dotNET 2013-03-05 03:49:08

+0

實際數據是一個股票市場價格表,但顯示更簡單的例子,我用肉,魚等。雖然我試圖用我的實際代碼完成上述查詢,但它不是我想要的。任何方式,感謝您的幫助。你能告訴我一個查詢代碼在哪裏,我將設置最新的時間是這樣的:SELECT p.Item,p.Qnt l.price FROM TABLE1 as p INNER JOIN Table2 as l ON p.Item = l.Item WHERE l。 Datetime ='2013-02-20 10:00:00'。如果與l.Datetime匹配,結果輸出將顯示ltp,否則將顯示ltp = 0;怎麼做? – stockBoi 2013-03-05 11:24:02