Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何将特定值与指定的整数范围相匹配?_Sql Server - Fatal编程技术网

Sql server 如何将特定值与指定的整数范围相匹配?

Sql server 如何将特定值与指定的整数范围相匹配?,sql-server,Sql Server,我有存储贷款计划的表,请注意,我只从计划表中提取了1个id 表:时间表 +-------------+-------------+-----------+ |ID | Date | Amount | +-------------+-------------+-----------+ | H 1807.0030 | 2020-10-25 | 338850.00 | | H 1807.0030 | 2020-11-25 | 301200.00 | | H

我有存储贷款计划的表,请注意,我只从计划表中提取了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  |
+-------------+-------------+-----------+
我想要这样的东西:

匹配1:

如果余额=附表。应返回日期“2021-03-25”的金额

比赛2:

如果余额>计划金额且小于比较2,则仍应返回日期“2021-03-25”

比赛3:

如果余额<附表金额且大于比较3,则应返回日期“2021-04-255”

我所尝试的:

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

但它只返回两个匹配金额的日期。有没有这样做的建议?谢谢。

如果我理解正确,您希望选择与等于或小于给定
余额的
金额相对应的
日期
。如果未找到相等的
金额
,则必须选择
余额
下方最接近的
金额

样本数据

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;

您希望最终结果是什么?@vv4d我的问题中包含了一个匹配样本。如果明细表中存在余额,余额表上是否有
datetime
date
列?你能提供另一张表的结构吗。您共享了一个明细表的完整定义和另一个明细表的最小详细信息。@vvv4d仅共享金额。您如何知道哪一行是Compare1与Compare2 verus Compare3?它们不是按顺序排列的,依次是2,1,3。你能描述一下这种逻辑吗?
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
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