1

架构和示例数据

下面是一些显示表格布局的示例数据。在此示例中,我仅显示特定 ITEM 和 SERIAL 的事务。然而,在生产中,还会有其他项目/序列号,因此执行的任何连接都需要在这两个字段上。

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 在技术上是一行中的两个事务,并确保每个 ISSRT(或 REISS)事务仅用于每个 RETN(或 REISS)事务一次。这听起来也很像 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 回答