2016-10-21 12 views
1

読んでいただきありがとうございます!最も近い日付に基づくT-SQL JOINテーブルのテーブル

私が答えようとしている質問は、「部品を作るのにどれくらいの費用がかかりますか?生の金属ビレットを金属部品に加工して製造しています。最終部品は顧客に販売され、プロセスのスクラップメタルはスクラップヤードに販売されます。

ビジネス/ ERP構成の理由から、私たちのスクラップベンダーは顧客としてリストされ、私たちは他の顧客と同じように彼の「部品」を出荷します。これらのダミー部品は、それぞれの金属合金のためのものであるため、使用する合金ごとに1つのダミーのスクラップ部分があります。スクラップの出荷は、スクラップビンに記入するたびに行われ、定義された時間間隔はありません。

実際の部品の出荷日を同じ合金の最も近いスクラップ出荷日に接続しようとしています。それから私は、私たちが支払った1ポンド当たりのスクラップ値をつかみ、それを私たちが作る部品のために収入に含めることができます。もし私が世界に求めることができるのであれば、実際の部品を出荷する直前または直後にスクラップの梱包方法を知ることは有益です。経営者は何度か彼らの心を変えて、 「前」または「後」の数字。

私は他のソリューションを試してみて、動作させることはできません。私は叔父を泣いています、私は単にそれを働かせることはできません....私たちのERPが使用するWeb SQLインターフェイスは、T - SQLの...これまで読んでいただきありがとうございます!

私は、出力は次のようになりたいのですがされています。ここで私はまでテーブルを沸かすことができ、最も簡単なのです

Customer Part  Price Alloy Weight_Lost Scrap_Value Ship_Date 
ABC  Widget1 99.99 C182 63   2.45   10-01-2016 

SELECT 
    tbl_Regular_Sales.Customer 
    tbl_Regular_Sales.Part 
    tbl_Regular_Sales.Price 
    tbl_Regular_Sales.Alloy 
    tbl_Regular_Sales.Weight_Lost 
    tbl_Scrap_Sales.Price AS 'Scrap_Value' 
    tbl_Regular_Sales.Ship_Date 
    FROM 
    (SELECT P.Part 
      ,P.Alloy 
      ,P.Price 
      ,S.Ship_Date 
      ,S.Customer 
    FROM Part AS P 
    JOIN S AS S 
    ON  S.Part_Key = P.Part_Key 
    WHERE Shipper.Customer = 'Scrap_Yard' 
    ) AS tbl_Scrap_Sales 
    JOIN 
     (SELECT P.Part 
       ,P.Weight_Lost 
       ,P.Alloy 
       ,P.Price 
       ,S.Ship_Date 
       ,S.Customer 
     FROM Part AS P 
     JOIN S AS S 
     ON  S.Part_Key = P.Part_Key 
     WHERE Shipper.Customer <> 'Scrap_Yard') AS tbl_Regular_Sales 
    ON 
    tbl_Regular_Sales.Alloy = tbl_Scrap_Sales.Alloy 
    AND <Some kind of date JOIN to get the closest scrap shipment value> 
+0

私はこのパターンをたくさん使います。 'date_col <=(どこからどこかで...)を選んでください。' –

答えて

1

このような何かが、トリックを行うことがあります。

WITH cteScrapSales AS (
    SELECT 
     P.Alloy 
     ,P.Price 
     ,S.Ship_Date 
    FROM Part AS P 
    JOIN Shipper AS S ON S.Part_Key = P.Part_Key 
    WHERE S.Customer = 'Scrap_Yard' 
), cteRegularSales AS (
    SELECT 
     P.Part_Key 
     ,P.Part 
     ,P.Weight_Lost 
     ,P.Alloy 
     ,P.Price 
     ,S.Ship_Date 
     ,S.Customer 
    FROM Part AS P 
    JOIN Shipper AS S ON S.Part_Key = P.Part_Key 
    WHERE S.Customer <> 'Scrap_Yard' 
) 
SELECT 
     C.Customer 
     ,C.Part 
     ,C.Price 
     ,C.Alloy 
     ,C.Weight_Lost 
     ,C.Scrap_Value 
     ,C.Ship_Date 
    FROM (
     SELECT R.*, S.Price AS Scrap_Value, ROW_NUMBER() OVER (PARTITION BY R.Part_Key ORDER BY DATEDIFF(SECOND, R.Ship_Date, S.Ship_Date)) ix 
     FROM cteRegularSales R 
     JOIN cteScrapSales S ON S.Allow = R.Allow AND S.Ship_Date > R.Ship_Date 
    ) AS C 
    WHERE C.ix = 1; 
+0

それは働きました、ありがとう〜!私はここで重要な操作や操作が何か不思議ですか?私は書類を読んで説明してくれることを迷惑にはしませんが、私は徹底的に感銘を受けます。 – SDS

+0

ウィンドウ関数は、作業中の強力なツールです...行のパーティションに基づいて値を計算することを可能にします。 https://www.simple-talk.com/sql/t-sql-programming/window-functions-in-sql/ - 基本的に、JOINは出荷された部品ごとにクロス結合を行い、後で出荷されるすべてのスクラップを処理してから、ウィンドウ関数を計算します日付差に基づくランクであり、これは、最も近い時間差を有するものを除いて、出荷された部品の交差結合されたすべての行をフィルタリングするために使用される。 – Lucero

+0

ちょうどエラーが見つかりました - 基本的に顧客へのすべての出荷のために、その貨物から最も近いスクラップ出荷日を取得したいと考えています。 \ 2011年10月1日からクエリを実行すると、今日のスクラップ値はすべて10/2016に発生したスクラップ出荷に由来します。 1月の出荷は、その時点からのスクラップ率(価格)を引き上げるべきです。クエリは、クエリで定義された終了日に最も近いレートだけでなく、その特定のシップメントに関連するスクラップレートを引き上げる必要があります。 – SDS

関連する問題