将空电荷分配给最活跃的合约
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 APPLY
与 TOP 1
和 ORDER 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')
我有一个用户输入了客户费用,但没有将这些具体费用分配给合同。
费用均为 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 APPLY
与 TOP 1
和 ORDER 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')