Присвоить пустые платежи активному контракту - PullRequest
0 голосов
/ 26 июня 2019

У меня есть пользователь, который ввел сборы для клиентов, но не назначил эти конкретные сборы для контракта.

Все сборы составляют 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'

1 Ответ

1 голос
/ 26 июня 2019

Используя 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...