У меня есть пользователь, который ввел сборы для клиентов, но не назначил эти конкретные сборы для контракта.
Все сборы составляют 135 долларов США и вводятся на определенную дату.Есть две таблицы, из которых мне нужно получить информацию: 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', ...)
Это возвращает следующее (~2000):
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 может иметь несколько контрактов, мне нужно установить плату за последний Активный контракт.Эта таблица для контрактов называется 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 потребуется идентификатор 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'