将空电荷分配给最活跃的合约

Assign Empty Charges to Top Active Contract

我有一个用户输入了客户费用,但没有将这些具体费用分配给合同。

费用均为 135 美元,并在特定日期输入。我需要从两个 table 中获取信息,t_ARLineItem(费用详情)和 t_Owner(所有者物品)我编写了以下代码来查找受影响的信息:

SELECT charge.ARLineItemID, charge.ContractID, charge.Amount, charge.DueDate, charge.UserName, owner.OwnerID, owner.OwnerNumber, owner.FirstName, owner.LastName FROM t_ARLineItem charge 
JOIN t_Owner owner
on charge.OwnerID = owner.OwnerID
WHERE charge.Amount = '135' AND charge.DueDate = '6/24/2019' AND charge.ContractID = '0' AND
charge.OwnerID IN ('OwnerID', 'OwnerID', ...)

这 returns 以下 (~2,000):

ARLineItemID | ContractID | Amount | DueDate | UserName | OwnerID | FirstName | LastName
-------------|------------|--------|---------|----------|---------|-----------|--------
123          | 0          | 135.00 | 6/24/19 | User     | 5       | Name      | Name
124          | 0          | 135.00 | 6/24/19 | User     | 8       | Name      | Name

我需要将没有 ContractID 的每笔费用分配给该所有者的最活跃合同。每个OwnerID可以有多个contract,我需要设置charge最新的Active Contract。合同的 table 是 t_Contract 并且结构为:

ContractID | OwnerID | ContractNumber | ContractDate | ContractStatus
-----------|---------|----------------|--------------|----------------
100        | 5       | 100            | 2015-05-15   | Active
151        | 5       | 151            | 2017-11-29   | Inactive
165        | 5       | 165            | 2019-05-25   | Active

在此示例中,OwnerID 5 需要将费用 ID 123 分配给合同 165。

ARLineItemID | ContractID | Amount | DueDate | UserName | OwnerID | FirstName | LastName
-------------|------------|--------|---------|----------|---------|-----------|--------
123          | 165        | 135.00 | 6/24/19 | User     | 5       | Name      | Name

编辑: 在社区的帮助下我已经走到这一步了,但是我无法让它工作

UPDATE t_ARLineItem
SET ContractID = latestActiveContract.ContractID
FROM t_ARLineItem charge 
    JOIN t_Owner owner ON charge.OwnerID = owner.OwnerID
    CROSS APPLY (
        SELECT TOP 1 *
        FROM t_Contract c 
        WHERE c.OwnerID = owner.OwnerID
            AND c.ContractStatus = 'Active'
        ORDER BY c.ContractDate DESC
    ) latestActiveContract
WHERE 
    charge.Amount = '135' 
    AND charge.DueDate = '6/24/2019' 
    AND charge.ContractID = '0' 
    AND charge.OwnerID = '16014'

CROSS APPLYTOP 1ORDER BY 结合使用,您可以将费用与最新的有效合同相匹配:

UPDATE charge
SET charge.ContractID = latestActiveContract.ContractID
FROM t_ARLineItem charge 
    JOIN t_Owner owner ON charge.OwnerID = owner.OwnerID
    CROSS APPLY (
        SELECT TOP 1 *
        FROM t_Contract c 
        WHERE c.OwnerID = owner.OwnerID
            AND c.ContractStatus = 'Active'
        ORDER BY c.ContractDate DESC
    ) latestActiveContract
WHERE 
    charge.Amount = '135' 
    AND charge.DueDate = '6/24/2019' 
    AND charge.ContractID = '0' 
    AND charge.OwnerID IN ('5', '8')