1

スキーマとサンプル データ

以下は、テーブル レイアウトを示すサンプル データです。この例では、特定の ITEM と SERIAL のトランザクションのみを表示しています。ただし、本番環境では他のアイテム/シリアルが存在するため、実行されるすべての結合はこれら 2 つのフィールドで行う必要があります。

transid Item                        qty Transdate               Type    Serial  IssuedTo
======= =========================== === ======================= ======= ======= ========
423371  SUNNENBOREGAGE1.18-2.0-3    1   2012-10-22 08:49:18.000 ISSRT   G-02145 742
422415  SUNNENBOREGAGE1.18-2.0-3    -1  2012-10-17 18:42:08.000 RETN    G-02145 139
422082  SUNNENBOREGAGE1.18-2.0-3    1   2012-10-17 13:21:38.000 REISS   G-02145 139
421518  SUNNENBOREGAGE1.18-2.0-3    1   2012-10-15 13:37:08.000 ISSRT   G-02145 709
421459  SUNNENBOREGAGE1.18-2.0-3    -1  2012-10-15 09:37:41.000 RETN    G-02145 640
421426  SUNNENBOREGAGE1.18-2.0-3    1   2012-10-15 08:02:19.000 ISSRT   G-02145 640
420100  SUNNENBOREGAGE1.18-2.0-3    -1  2012-10-10 06:23:34.000 RETN    G-02145 742
420097  SUNNENBOREGAGE1.18-2.0-3    1   2012-10-10 06:22:21.000 ISSRT   G-02145 742

すべての返品は、RETN または REISS のいずれかのタイプでマークされます。すべての問題は、ISSRT または REISS のいずれかのタイプによってマークされます。再発行 (REISS) は、返品と発行の両方です。ISSUEDTO フィールドは、REISS または ISSRT トランザクションのアイテムを誰が受け取ったかを示します。

望ましい結果

要するに、日付範囲 (四半期) 内のすべての返品を検索し、一致する発行トランザクション (いつ発行されたかに関係なく) を見つけて、発行された従業員とその期間 (日数) を特定できるようにする必要があります。その従業員はその特定のアイテム/シリアルを持っていました。

私の最終的な結果セットには、次のような列があります。

ITEM SERIAL EMPLOYEE ISSUETRANSID ISSUEDATE RETURNTRANSID RETURNDATE DAYSOUT

REISS は技術的には 1 つの行に 2 つのトランザクションがあり、各 ISSRT (または REISS) トランザクションが各 RETN (または REISS) トランザクションに対して 1 回だけ使用されるようにするため、これを行う方法について頭を悩ませているようには見えません。これも FIFO/LIFO の問題のように聞こえますが、ここでロジックを適用できないようです (これは私自身の欠点かもしれません)。

どんな助けや指針も大歓迎です!ありがとうございます=)

4

1 に答える 1

0

さらに調査を行った後、私の質問に対する答えを見つけたと思います。次の投稿の情報を使用することが必要でした。

SQL Server: 最初の行に結合する方法

私のコード(具体的で、私のサンプルデータと明示的に一致しない場合があります):

SELECT 
    ReturnedItems.SerialID AS SerialID,
    ReturnedItems.Item AS R_Item,
    ReturnedItems.TransNumber AS R_TransNumber,
    ReturnedItems.TransDate AS R_TransDate,
    ReturnedItems.TypeDescription AS R_TransDescription,
    ReturnedItems.IssuedTo AS R_IssuedTo,
    IssuedItems.TransNumber AS I_TransNumber,
    IssuedItems.TransDate AS I_TransDate,
    IssuedItems.TypeDescription AS I_TransDescription,
    IssuedItems.IssuedTo AS I_IssuedTo,
    DATEDIFF(HOUR, IssuedItems.TransDate, ReturnedItems.TransDate) / 24 AS Days_Out
FROM 
    CribMaster.dbo.TRANS AS ReturnedItems CROSS APPLY (
        SELECT TOP 1 
            CribMaster.dbo.TRANS.Item AS Item,
            CribMaster.dbo.TRANS.SerialID AS SerialID,
            CribMaster.dbo.TRANS.TransNumber AS TransNumber,
            CribMaster.dbo.TRANS.TransDate AS TransDate,
            CribMaster.dbo.TRANS.TypeDescription AS TypeDescription,
            CribMaster.dbo.TRANS.IssuedTo AS IssuedTo
        FROM 
            CribMaster.dbo.TRANS 
        WHERE
            CribMaster.dbo.TRANS.SerialID = ReturnedItems.SerialID AND 
            CribMaster.dbo.TRANS.TypeDescription IN ('ISSRT', 'REISS') AND 
            CribMaster.dbo.TRANS.TransDate < ReturnedItems.TransDate
        ORDER BY 
            CribMaster.dbo.TRANS.TransDate DESC
    ) AS IssuedItems
WHERE 
    ReturnedItems.TypeDescription IN ('RETN', 'REISS') AND 
    ReturnedItems.TransDate < '10/1/2012' AND
    ReturnedItems.TransDate >= '7/1/2012'
于 2012-11-25T22:01:00.633 に答える