sql-server - 如何将特定值与指定的整数范围匹配?
问题描述
我有存储贷款时间表的表,请注意我只从时间表表中提取了 1 个 ID
表:时间表
+-------------+-------------+-----------+
|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 |
+-------------+-------------+-----------+
我想要这样的东西:
第一场比赛:
IF Balance = Schedules.Amount 它应该返回 Date "2021-03-25"
+-------------+-----------+
|ID | Balance |
+-------------+-----------+
| H 1807.0030 | 150600.00 |
+-------------+-----------+
比赛2:
IF Balance > Schedules.Amount 且小于 Compare2 它仍应返回 Date "2021-03-25"
+-------------+-----------+
|ID | Balance |
+-------------+-----------+
| H 1807.0030 | 150800.00 |
+-------------+-----------+
第 3 场比赛:
如果 Balance < Schedules.Amount 且大于 Compare3,则应返回 Date "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
但它只返回两个匹配金额的日期。有什么建议这样做吗?谢谢。
解决方案
如果我理解正确,您想选择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
推荐阅读
- angular-cli - 在 ng-packagr 中禁用 TypeScript 不匹配
- python - 如何安装python启动器
- angular - Leaflet Tiles 无法在移动设备上的 Angular 中正确加载
- java - 使用 Firebase 数据库为每个孩子获取最后一个孩子
- scipy - Scipy:过度的 odeint 工作
- c# - 如何在不阻塞的情况下从(重定向的标准输出)StreamReader 读取?
- java - 应用程序启动方法 java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 中的异常
- javascript - 无法使用打字稿中的数组读取 null 的属性
- c# - C#:如何使用计时器停止方法
- javascript - 与 d3 中的其他元素执行双 mouseup 事件