2

私は全体的にSQLに少し慣れていないので、ここまでたどり着くことができましたが、今は少し行き詰まっています。

私は 2 つのテーブルを持っています。1 つは「船」から「オイル タイプ」のインデックスだけです。もう一方の表「ROB」は、船に残っている油の量です。

毎月、ROB テーブルに新しいレコードを取得する場合と取得しない場合があります。

私が必要としているのは、特定の船のそれぞれの異なるオイルの種類と、最新の ROB がある場合はそれです。

次のクエリは、オイルの種類ごとにすべての ROB を取得し、最新のものだけが必要であることを除いて、ほとんど私が望むものです。

PARAMETERS QueryShipID Short;
SELECT Oils.OilID, Oils.ShipID, ROB.LastROB, ROB.Received, ROB.DateReceived, ROB.PortReceived, ROB.TotalUsed, ROB.CurrentROB, ROB.DateSent
FROM 
    (SELECT DISTINCT OilID, ShipID 
    FROM [Index] 
    WHERE (((ShipID)=[QueryShipID])))  
    AS Oils 

    LEFT JOIN 

    (SELECT ShipID, OilId, LastROB, Received, DateReceived, PortReceived, TotalUsed, CurrentROB, DateSent 
    FROM [Oil ROB])  
    AS ROB 

    ON (Oils.ShipID = ROB.ShipID) AND (Oils.OilID = ROB.OilID);

私がする必要があるのは、オイルの種類ごとに最後の DateSent を取得することです。

集計クエリの結果を元のテーブルに結合することを提案しているように見える Max 関数の使用に関するチュートリアルをいくつか見つけました。ただし、これを機能させることができないようで、巨大で面倒なクエリが作成されます。

誰かがこれを行うための最良の方法についていくつかのヒントを持っていれば、私は非常に感謝しています.

理想的には、これを行った後、特定の日付の前に最後の ROB を取得できるように、日付のパラメーターを追加したいと思います。これは比較的簡単なはずですが、回答に関係がある場合に備えて含めます。

ありがとうございます。

デイブ

4

3 に答える 3

0

最近、ほぼ同じ質問をしたと思います この SQL Select newest records have different Name column

于 2012-05-08T17:01:00.630 に答える
0
SELECT    Oils.OilID, Oils.ShipID, ROB.LastROB, ROB.Received, ROB.DateReceived, 
          ROB.PortReceived, ROB.TotalUsed, ROB.CurrentROB, ROB.DateSent
FROM 
          (
           SELECT DISTINCT OilID, ShipID 
           FROM   [Index] 
           WHERE  ShipID = [QueryShipID]
          ) AS Oils 

LEFT JOIN  

          (
           SELECT ShipID, OilId, LastROB, Received, DateReceived, PortReceived, 
                  TotalUsed, CurrentROB, DateSent 
           FROM   [Oil ROB] 
           WHERE  DateSent = (
                              SELECT MAX(DateSent) 
                              FROM   [Oil ROB] 
                              WHERE  Oils.ShipID = ROB.ShipID AND 
                                     Oils.OilID = ROB.OilID
                             )
          )  AS ROB ON Oils.ShipID = ROB.ShipID AND Oils.OilID = ROB.OilID;
于 2012-05-08T17:18:02.767 に答える
0

ありがとう

nawfulが投稿したものをわずかに変更したものであるため、私は自分で回答を投稿しています。また、K'legが投稿したリンクも役に立ちました。ありがとうございます。

これはまさに私が欲しいものを手に入れます...

SELECT    Oils.OilID, Oils.ShipID, ROB.LastROB, ROB.Received, ROB.DateReceived,  
          ROB.PortReceived, ROB.TotalUsed, ROB.CurrentROB, ROB.DateSent 
FROM  
          ( 
           SELECT DISTINCT OilID, ShipID  
           FROM   [Index]  
           WHERE  ShipID = [QueryShipID] 
          ) AS Oils             
LEFT JOIN   
          ( 
           SELECT ShipID, OilId, LastROB, Received, DateReceived, PortReceived,  
                  TotalUsed, CurrentROB, DateSent  
           FROM   [Oil ROB]  
          )  AS ROB ON Oils.ShipID = ROB.ShipID AND Oils.OilID = ROB.OilID
WHERE     ROB.DateSent = ( 
                          SELECT MAX(DateSent)  
                          FROM   [Oil ROB]  
                          WHERE  ShipID = ROB.ShipID AND  
                                 OilID = ROB.OilID
                         );

主な変更点は、Oils.OilID ではなく ROB.OilID と一致する [Oil ROB] テーブルの OilID が必要なことです。また、WHERE を最も外側の SELECT に移動しました。

でも、あなたなしではできなかったでしょう :)

于 2012-05-09T08:12:37.377 に答える