Как сопоставить определенное значение с указанным диапазоном целых чисел?

#sql-server

#sql-server

Вопрос:

У меня есть таблицы, в которых хранятся графики займов, пожалуйста, обратите внимание, что я извлек только 1 идентификатор из таблицы расписания

Таблица: Расписание

  ------------- ------------- ----------- 
|ID           |   Date      | Amount    |
 ------------- ------------- ----------- 
| H 1807.0030 | 2020-10-25  | 338850.00 |
| H 1807.0030 | 2020-11-25  | 301200.00 |
| H 1807.0030 | 2020-12-25  | 263550.00 |
| H 1807.0030 | 2021-01-25  | 225900.00 |
| H 1807.0030 | 2021-02-25  | 188250.00 | > Compare2
| H 1807.0030 | 2021-03-25  | 150600.00 | > Compare1
| H 1807.0030 | 2021-04-25  | 112950.00 | > Compare3
| H 1807.0030 | 2021-05-25  | 75300.00  |
| H 1807.0030 | 2021-06-25  | 37650.00  |
 ------------- ------------- ----------- 
  

Я хочу что-то вроде этого:

Сопоставление 1:

ЕСЛИ баланс = расписания.Сумма, которую он должен возвращать, Дата «2021-03-25»

  ------------- ----------- 
|ID           | Balance   |
 ------------- ----------- 
| H 1807.0030 | 150600.00 |
 ------------- ----------- 
  

Сопоставление 2:

ЕСЛИ Баланс > Расписания.Количество и меньше сравнения2 оно все равно должно возвращать дату «2021-03-25»

  ------------- ----------- 
|ID           | Balance   |
 ------------- ----------- 
| H 1807.0030 | 150800.00 |
 ------------- ----------- 
  

Сопоставление 3:

ЕСЛИ баланс < Расписания.Количество и больше, чем Compare3, оно должно возвращать дату «2021-04-255»

  ------------- ----------- 
|ID           | Balance   |
 ------------- ----------- 
| H 1807.0030 | 113950.00 |
 ------------- ----------- 
  

Что я пробовал:

 OUTER APPLY (
      SELECT TOP(1) LoanId, DatePayment,InterestBalance, TotalBalance 
      FROM LoanSchedules where LoanID = loans.LoanID
          AND TotalBalance = scheduleofaccountscurrentlr.Balance --##Comparison
      ORDER BY DatePayment DESC
) tmpschedintbal
  

Но он возвращает только дату двух совпадающих сумм. Есть предложения по этому поводу? Спасибо.

Комментарии:

1. Какими вы хотите видеть конечные результаты?

2. @vvvv4d Я включил образцы соответствия в свой вопрос. Если баланс существует в таблице расписания.

3. есть ли столбец datetime или date в таблице балансов? Можете ли вы предоставить структуру другой таблицы. Вы поделились полным определением одной таблицы расписания и минимальными сведениями о другой.

4. @vvvv4d только количество.

5. Откуда вы знаете, какая строка является Compare1 по сравнению с Compare2 или Compare3? они расположены не в порядке следования 2, 1, 3. Можете ли вы помочь описать эту логику?

Ответ №1:

Если я правильно понимаю, вы хотите выбрать значение, Date соответствующее Amount , которое равно или меньше заданного Balance . В случае, если значение не равно Amount , необходимо выбрать ближайшее значение, Amount указанное ниже Balance .

Пример данных

 create table Schedule
(
  ID nvarchar(11),
  Date date,
  Amount money
);

insert into Schedule (ID, Date, Amount) values
('H 1807.0030', '2020-10-25', 338850.00),
('H 1807.0030', '2020-11-25', 301200.00),
('H 1807.0030', '2020-12-25', 263550.00),
('H 1807.0030', '2021-01-25', 225900.00),
('H 1807.0030', '2021-02-25', 188250.00),
('H 1807.0030', '2021-03-25', 150600.00),
('H 1807.0030', '2021-04-25', 112950.00),
('H 1807.0030', '2021-05-25', 75300.00 ),
('H 1807.0030', '2021-06-25', 37650.00 );

create table Ledger
(
  Example int,
  ID nvarchar(11),
  Balance money
);

insert into Ledger (Example, ID, Balance) values
(1, 'H 1807.0030', 150600.00), -- expect 2021-03-25
(2, 'H 1807.0030', 150800.00), -- expect 2021-03-25
(3, 'H 1807.0030', 113950.00); -- expect 2021-04-25
  

Решение

 select l.Example,
       l.ID,
       l.Balance,
       x.Date
from Ledger l
cross apply (  select top 1 s.Date
               from Schedule s
               where s.ID = l.ID
                 and s.Amount-l.Balance <= 0
               order by s.Amount-l.Balance desc ) x
order by l.Example;
  

Результат

 Example  ID           Balance      Date
-------- ------------ ------------ -----------
1        H 1807.0030  150600.0000  2021-03-25
2        H 1807.0030  150800.0000  2021-03-25
3        H 1807.0030  113950.0000  2021-04-25
  

Скрипка