0

我的数据库中有两个表:

表 1:采购项目

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 每小时更新每个项目的当前价格。因此,从表 2 中可以清楚地看出,Meat 最后一次交易是在 2013 年 2 月 20 日上午 10 点,而鱼不是在同一天交易,它是在 2013 年 2 月 19 日上午 9 点交易的,而鸡肉是在 2013 年 2 月 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 子句中应该应用什么连接类型和什么条件来获得上述输出呢?

4

1 回答 1

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输出最新的。我们将此结果称为 A。现在我们将 A 与 Table2 连接起来,以获取这些最新日期的列值。生成的表称为LatestPriceTable,将仅包含项目名称和最新价格。现在您可以简单地将它与 Table1 连接起来进行计算。DateTimeItemPrice

我确实有一种感觉,您设计的系统可能不足以实现您想要实现的目标。它是一种库存类型的应用程序吗?我看到的问题是您总是将当前库存数量与最新市场价格相乘。实际上,库存几乎总是包含在不同日期以不同价格进行的购买。

但话又说回来,我不确定你的确切目的,所以也许你可以忍受你正在做的事情。

于 2013-03-04T17:28:06.480 回答