0

データベースに 2 つのテーブルがあります。

表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 には各アイテムの現在の価格が 1 時間ごとに更新されます。したがって、表 2 から、肉が最後に取引されたのは 2013 年 2 月 20 日午前 10 時であることがはっきりとわかります。一方、魚は同じ日に取引されたのではなく、2013 年 2 月 19 日に午前 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 ItemDateTime、それぞれの最新のものを出力しますItem。この結果を A と呼びます。次に、A を Table2 と結合してPrice、これらの最新の日付の列の値を取得します。結果のテーブルは、LatestPriceTable と呼ばれ、アイテム名と最新の価格のみが含まれます。これで、単純に Table1 と結合して計算を行うことができます。

あなたが設計したシステムは、あなたが達成しようとしているものに対して十分ではないかもしれないと感じています. 在庫のようなアプリケーションですか?私が見る問題は、常に現在の在庫数に最新の市場価格を掛けていることです。実際には、在庫にはほとんどの場合、異なる日に異なるレートで行われた購入が含まれます。

繰り返しになりますが、あなたの正確な目的についてはよくわかりません。

于 2013-03-04T17:28:06.480 に答える