如何解决将行拆分为多行
我需要将一行分成几行
例如,我有一个结果,该结果表示用户应分几期支付的总金额,并且每期是基于分期间隔的到期日期,因此每个TotalSum除以InstallsmentNoTotal,即每个分期付款金额,对于首期付款的InstallmentDate,则为FirstInstallmentDate,但对于其他每期付款,我们都应添加InstallsmentInterval Days。
DECLARE @temTable TABLE
(
Id INT,TotalSum DECIMAL(18,0),InstallsmentNoTotal INT,InstallsmentInterval INT,FirstInstallmentDate DATE
);
INSERT INTO @temTable
(
Id,TotalSum,InstallsmentNoTotal,InstallsmentInterval,FirstInstallmentDate
)
VALUES
(1,6000,3,30,'2020-08-01'),(2,8000,2,60,'2020-10-01'),(3,5000,1,'2020-08-01')
SELECT * FROM @temTable
Id TotalSum InstallsmentNoTotal InstallsmentInterval FirstInstallmentDate
1 6000 3 30 2020-08-01
2 8000 2 60 2020-10-01
3 5000 1 0 2020-08-01
我需要像这样显示每一行的数据:
SaleId InstallmentNo InstallmensAmount NextInstallmentDate
1 1 2000 2020-08-01
1 2 2000 2020-09-01
1 3 2000 2020-10-01
2 1 4000 2020-10-01
2 2 4000 2020-12-01
3 1 5000 2020-08-01
我尝试使用“光标”,“交叉应用”,但无法管理工作。
预先感谢您的帮助
解决方法
您可以使用递归查询:
with cte as (
select
id saleId,1 InstallmentNo,TotalSum / InstallsmentNoTotal InstallmentAmount,FirstInstallmentDate NextInstallmentDate,InstallsmentInterval,InstallsmentNoTotal
from @temTable
union all
select
saleId,InstallmentNo + 1,InstallmentAmount,cast(dateadd(day,NextInstallmentDate) as date),InstallsmentNoTotal
from cte
where InstallmentNo < InstallsmentNoTotal
)
select saleId,NextInstallmentDate
from cte
order by saleId,InstallmentNo
有关示例数据,this returns:
saleId | InstallmentAmount | InstallmentAmount | NextInstallmentDate -----: | ----------------: | ----------------: | :------------------ 1 | 2000.00000000000 | 2000.00000000000 | 2020-08-01 1 | 2000.00000000000 | 2000.00000000000 | 2020-08-31 1 | 2000.00000000000 | 2000.00000000000 | 2020-09-30 2 | 4000.00000000000 | 4000.00000000000 | 2020-10-01 2 | 4000.00000000000 | 4000.00000000000 | 2020-11-30 3 | 5000.00000000000 | 5000.00000000000 | 2020-08-01
您可以看到日期运算不是您想要的。如果要按月增加日期,则应存储数月而不是数天(并在CTE的递归成员中用dateadd(day,...)
修改dateadd(month,...)
。
这是一种满足要求的基于“ tally”表的方法。这种方法是一种简单有效的方法,可基于数字或理货表格进行向前计算。在这种情况下,我将其设置为6个值,但可以将其增加到所需的任何值(以满足最大的InstallsmentNoTotal)。基于Imo tally的方法更简单,更具可读性,并且(在极限情况下)更快。
数据
create table #temTable
(
Id INT,TotalSum DECIMAL(18,0),InstallsmentNoTotal INT,InstallsmentInterval INT,FirstInstallmentDate DATE
);
INSERT INTO #temTable
(
Id,TotalSum,InstallsmentNoTotal,FirstInstallmentDate
)
VALUES
(1,6000,3,30,'2020-08-01'),(2,8000,2,60,'2020-10-01'),(3,5000,1,'2020-08-01');
查询
select id SaleId,t.TotalSum/t.InstallsmentNoTotal InstallmentAmount,dateadd(month,(InstallsmentInterval/30)*(tally.n-1),FirstInstallmentDate) NextInstallmentDate
from #temTable t
cross apply
(select n from (values (1),(2),(3),(4),(5),(6)) v(n)
where n<=t.InstallsmentNoTotal) tally;
输出
SaleId InstallmentAmount NextInstallmentDate
1 2000.00000000000 2020-08-01
1 2000.00000000000 2020-09-01
1 2000.00000000000 2020-10-01
2 4000.00000000000 2020-10-01
2 4000.00000000000 2020-12-01
3 5000.00000000000 2020-08-01
,
您可以要求CTE获得结果集。
;WITH CTE_Installments as
(
SELECT Id,TotalSum/InstallsmentNoTotal AS InstallmentSum,1 as CurrentinstallmentNo,dateadd(dd,FirstInstallmentDate) as nextInstallmentDate,InstallsmentInterval FROM @temTable
union all
SELECT Id,InstallmentSum,CurrentInstallmentNo+1 as currentinstallmentNo,nextInstallmentDate) as nextInstallmentDate,InstallsmentInterval
from CTE_Installments
where CurrentinstallmentNo < InstallsmentNoTotal
)
SELECT Id as salesId,CurrentinstallmentNo as InstallmentNo,nextInstallmentDate
FROM CTE_Installments
order by Id
+---------+---------------+------------------+---------------------+
| salesId | InstallmentNo | InstallmentSum | nextInstallmentDate |
+---------+---------------+------------------+---------------------+
| 1 | 1 | 2000.00000000000 | 2020-08-31 |
| 1 | 2 | 2000.00000000000 | 2020-09-30 |
| 1 | 3 | 2000.00000000000 | 2020-10-30 |
| 2 | 1 | 4000.00000000000 | 2020-11-30 |
| 2 | 2 | 4000.00000000000 | 2021-01-29 |
| 3 | 1 | 5000.00000000000 | 2020-08-01 |
+---------+---------------+------------------+---------------------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。