如何用sql 实现逐行加减数据!

oHaiBin123456 2016-08-23 05:49:28
---数据库表里面有如下的记录:
合同号 业务类型 合同金额 计划金额 回款金额
1216081201 合同 332,000.00 - -
1216081201 计划 - 99,600.00 -
1216081201 计划 - 232,400.00 -
1216081201 回款 - - 199,600.00
16080873 合同 758,500.00 - -
16080873 计划 - 428,250.00 -
16080873 计划 - 63,200.00 -
16080873 计划 - 63,200.00 -
16080873 计划 - 63,200.00 -
16080873 计划 - 63,200.00 -
16080873 计划 - 63,200.00 -
16080873 回款 - - 300,000.00
16080873 回款 - - -100,000.00
16080873 回款 - - 6,900.00
16080873 回款 - - 430,600.00
16080873 回款 - - -5,000.00
---想实现 回款 自动按行 逐行减计划金额,形成如下的结果:

合同号 业务类型 合同金额 计划金额 回款金额
1216081201 合同 332,000.00 - -
1216081201 计划 - 99,600.00 99,600
1216081201 计划 - 232,400.00 100,000

16080873 合同 758,500.00 - -
16080873 计划 - 428,250.00 428,250.00
16080873 计划 - 63,200.00 63,200.00
16080873 计划 - 63,200.00 63,200.00
16080873 计划 - 63,200.00 63,200.00
16080873 计划 - 63,200.00 14650.00
16080873 计划 - 63,200.00 -
----------------------------
谢谢大家!


...全文
866 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-08-23
  • 打赏
  • 举报
回复
这样改
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#TABLE1') is null
	drop table #TABLE1
Go
Create table #TABLE1([合同号] int,[业务类型] nvarchar(22),[合同金额] MONEY)
Insert #TABLE1
select 1216081201,N'合同',N'332,000.00' union all
select 16080873,N'合同',N'758,500.00'
Go

--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#TABLE2') is null
	drop table #TABLE2
Go
Create table #TABLE2([合同号] int,[业务类型] nvarchar(22),[计划金额] MONEY)
Insert #TABLE2
select 1216081201,N'计划',N'99,600.00' union all
select 1216081201,N'计划',N'232,400.00' union all
select 16080873,N'计划',N'428,250.00' union all
select 16080873,N'计划',N'63,200.00' union all
select 16080873,N'计划',N'63,200.00' union all
select 16080873,N'计划',N'63,200.00' union all
select 16080873,N'计划',N'63,200.00' union all
select 16080873,N'计划',N'63,200.00'
Go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#TABLE3') is null
	drop table #TABLE3
Go
Create table #TABLE3([合同号] int,[业务类型] nvarchar(22),[回款金额] MONEY)
Insert #TABLE3
select 1216081201,N'回款',N'199,600.00' union all
select 16080873,N'回款',N'300,000.00' union all
select 16080873,N'回款',N'-100,000.00' union all
select 16080873,N'回款',N'6,900.00' union all
select 16080873,N'回款',N'430,600.00' union all
select 16080873,N'回款',N'-5,000.00'
Go

;WITH CTEPlan
AS
(
SELECT *,Ord=ROW_NUMBER()OVER(ORDER BY RAND()) FROM #TABLE2 --WHERE 业务类型='计划'
),CTEPlan2
AS
(
SELECT *,(SELECT SUM(计划金额) FROM CTEPlan WHERE 合同号=a.合同号 AND Ord<=a.Ord) AS Sum计划金额
FROM CTEPlan AS a
)
SELECT a.合同号,a.业务类型,a.合同金额,计划金额=0,回款金额=0,Ord=0 FROM #TABLE1 AS a --WHERE a.业务类型='合同'
UNION ALL
SELECT 
a.合同号,a.业务类型,合同金额=0,a.计划金额,回款金额=CASE WHEN a.Sum计划金额<b.Sum回款金额 THEN a.计划金额
WHEN a.Sum计划金额-a.计划金额<b.Sum回款金额 THEN b.Sum回款金额-a.Sum计划金额+a.计划金额  ELSE 0 END ,a.Ord
FROM CTEPlan2 AS a
LEFT JOIN 
(SELECT 合同号,SUM(回款金额) AS Sum回款金额 FROM #TABLE3 /*WHERE 业务类型='回款'*/ GROUP BY 合同号) AS b ON a.合同号=b.合同号

ORDER BY 合同号 DESC,Ord
--Ord用于排序,不显示嵌套一个结果集就行了
/*
合同号	业务类型	合同金额	计划金额	回款金额	Ord
1216081201	合同	332000.00	0.00	0.00	0
1216081201	计划	0.00	99600.00	99600.00	1
1216081201	计划	0.00	232400.00	100000.00	2
16080873	合同	758500.00	0.00	0.00	0
16080873	计划	0.00	428250.00	428250.00	3
16080873	计划	0.00	63200.00	63200.00	4
16080873	计划	0.00	63200.00	63200.00	5
16080873	计划	0.00	63200.00	63200.00	6
16080873	计划	0.00	63200.00	14650.00	7
16080873	计划	0.00	63200.00	0.00	8
*/
oHaiBin123456 2016-08-23
  • 打赏
  • 举报
回复
oHaiBin123456 2016-08-23
  • 打赏
  • 举报
回复
---数据库表里面有如下的记录: ---TABLE1 合同号 业务类型 合同金额 1216081201 合同 332,000.00 16080873 合同 758,500.00 ---TABLE2 合同号 业务类型 计划金额 1216081201 计划 - 99,600.00 1216081201 计划 - 232,400.00 16080873 计划 - 428,250.00 16080873 计划 - 63,200.00 16080873 计划 - 63,200.00 16080873 计划 - 63,200.00 16080873 计划 - 63,200.00 16080873 计划 - 63,200.00 - ----TABLE3 合同号 业务类型 回款金额 1216081201 回款 199,600.00 16080873 回款 300,000.00 16080873 回款 -100,000.00 16080873 回款 6,900.00 16080873 回款 430,600.00 16080873 回款 -5,000.00 ---想实现 回款 自动按行 逐行减计划金额,形成如下的结果: ------------------------------------------------------------------------------------------ 合同号 业务类型 合同金额 计划金额 回款金额 1216081201 合同 332,000.00 0 0 1216081201 计划 - 99,600.00 99,600 1216081201 计划 - 232,400.00 100,000 16080873 合同 758,500.00 - - 16080873 计划 - 428,250.00 428,250.00 16080873 计划 - 63,200.00 63,200.00 16080873 计划 - 63,200.00 63,200.00 16080873 计划 - 63,200.00 63,200.00 16080873 计划 - 63,200.00 14,650.00 16080873 计划 - 63,200.00 - --------------------------------------------------------谢谢!QQ:59148063,
中国风 2016-08-23
  • 打赏
  • 举报
回复 1
参照

;WITH CTEPlan
AS
(
SELECT *,Ord=ROW_NUMBER()OVER(ORDER BY RAND()) FROM TabName WHERE 业务类型='计划'
),CTEPlan2
AS
(
SELECT *,(SELECT SUM(计划金额) FROM CTEPlan WHERE 合同号=a.合同号 AND Ord>=a.Ord) AS Sum计划金额
FROM CTEPlan AS a
)
SELECT a.合同号,a.业务类型,a.合同金额,a.计划金额,工a.回款金额,Ord=0 FROM TabName AS a WHERE a.业务类型='合同'
UNION ALL
SELECT 
a.合同号,a.业务类型,a.合同金额,a.计划金额,回款金额=CASE WHEN a.Sum计划金额<b.Sum回款金额 THEN a.计划金额
WHEN a.Sum计划金额-a.计划金额<b.Sum回款金额 THEN b.Sum回款金额-a.Sum计划金额+a.计划金额  END ,a.Ord
FROM CTEPlan2 AS a
LEFT JOIN 
(SELECT 合同号,SUM(回款金额) AS Sum回款金额 FROM TabName WHERE 业务类型='回款' GROUP BY 合同号) AS b ON a.合同号=b.合同号

ORDER BY 合同号,Ord
oHaiBin123456 2016-08-23
  • 打赏
  • 举报
回复
或者可以把记录 分成 3个表 合同,计划,回款 --------------------------- 实现计划完成统计,关键字段 合同编号
oHaiBin123456 2016-08-23
  • 打赏
  • 举报
回复
只有合同号列
中国风 2016-08-23
  • 打赏
  • 举报
回复
这样的表结构设计太差效率很低
中国风 2016-08-23
  • 打赏
  • 举报
回复
没有一列标识大小关系 ?如标识列/日期/行号等

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧