#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