sql server T_SQL help

2017_PX 2018-03-19 03:48:36
合同里产品行会有很多个版本,每一个版本会有很多个产品行, 比如第一个版本产品3行,二版5行,三版6行,
逻辑运算:第一版的效果列difference 永远等于原始Totalamount列,当VersionNo为2的时候,就会与第一版的去比较, 条件为Sequence相等,
也就是说第二版的第一行产品金额与第一版的第一行产品金额比较 得出 50-100 = -50,如果当前版本的行无法匹配上版本行就等于当前版本产品行的金额
第二版产品行4无法匹配出第一版产品行4,就等于二版产品行金额为700.
注意:已知某个版本的产品行有268行,非常感谢各位的帮助 ~




--原始数据
---第一版
ContractID VersionNo ProductCode Sequence Totalamount
CS180195 1 42CN00530CALB 1 100
CS180195 1 4242CN00530CARB 2 200
CS180195 1 424230RQ130ACCSETBHS 3 300
---第二版
CS180198 2 424230RQ130ACCSETBHS 1 50
CS180198 2 424230RQ130ACCSETBH1 2 500
CS180198 2 424230RQ130ACCSETBH2 3 600
CS180198 2 424230RQ130ACCSETBH3 4 700
CS180198 2 424230RQ130ACCSETBH4 5 800
---第二版
CS180363 3 424230RQ130ACCSETBHS 1 10
CS180363 3 424230RQ130ACCSETBH1 2 400
CS180363 3 424230RQ130ACCSETBH2 3 400
CS180363 3 424230RQ130ACCSETBH3 4 400
CS180363 3 424230RQ130ACCSETBH4 5 400
CS180363 3 424230RQ130ACCSETBH4 6 400

-----------------------------
--结果
---第一版
ContractID VersionNo ProductCode Sequence Totalamount ( difference 结果&效果列)
CS180195 1 42CN00530CALB 1 100 100
CS180195 1 4242CN00530CARB 2 200 200
CS180195 1 424230RQ130ACCSETBHS 3 300 300
---第二版
CS180198 2 424230RQ130ACCSETBHS 1 50 -50
CS180198 2 424230RQ130ACCSETBH1 2 500 300
CS180198 2 424230RQ130ACCSETBH2 3 600 300
CS180198 2 424230RQ130ACCSETBH3 4 700 700
CS180198 2 424230RQ130ACCSETBH4 5 800 800
---第二版
CS180363 3 424230RQ130ACCSETBHS 1 10 -40
CS180363 3 424230RQ130ACCSETBH1 2 400 -100
CS180363 3 424230RQ130ACCSETBH2 3 400 -200
CS180363 3 424230RQ130ACCSETBH3 4 400 -300
CS180363 3 424230RQ130ACCSETBH4 5 400 -400
CS180363 3 424230RQ130ACCSETBH4 6 400 400
...全文
301 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
2017_PX 2018-03-19
  • 打赏
  • 举报
回复
谢谢,是这个样子,我消化下你的sql语句, 结贴过一哈
二月十六 2018-03-19
  • 打赏
  • 举报
回复
是这个意思吗?
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([ContractID] nvarchar(28),[VersionNo] int,[ProductCode] nvarchar(40),[Sequence] int,[Totalamount] int)
Insert #T1
select N'CS180195',1,N'42CN00530CALB',1,100 union all
select N'CS180195',1,N'4242CN00530CARB',2,200 union all
select N'CS180195',1,N'424230RQ130ACCSETBHS',3,300 union all
select N'CS180195',2,N'424230RQ130ACCSETBHS',1,50 union all
select N'CS180195',2,N'424230RQ130ACCSETBH1',2,500 union all
select N'CS180195',2,N'424230RQ130ACCSETBH2',3,600 union all
select N'CS180195',2,N'424230RQ130ACCSETBH3',4,700 union all
select N'CS180195',2,N'424230RQ130ACCSETBH4',5,800 union all
select N'CS180195',3,N'424230RQ130ACCSETBHS',1,10 union all
select N'CS180195',3,N'424230RQ130ACCSETBH1',2,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH2',3,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH3',4,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH4',5,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH4',6,400
Go
--测试数据结束
SELECT * ,
Totalamount AS [difference]
FROM #T1 WHERE VersionNo=1
UNION ALL
SELECT #T11.* ,
CASE WHEN #T12.Totalamount IS NOT NULL
THEN #T11.Totalamount - #T12.Totalamount
ELSE #T11.Totalamount
END AS [difference]
FROM #T1 AS #T11
LEFT JOIN #T1 AS #T12 ON #T11.[Sequence] = #T12.[Sequence]
AND #T11.ContractID = #T12.ContractID
AND #T12.VersionNo=1
WHERE #T11.VersionNo=2
UNION ALL
SELECT #T13.* ,
CASE WHEN #T14.Totalamount IS NOT NULL
THEN #T13.Totalamount - #T14.Totalamount
ELSE #T13.Totalamount
END AS [difference]
FROM #T1 AS #T13
LEFT JOIN #T1 AS #T14 ON #T13.[Sequence] = #T14.[Sequence]
AND #T14.ContractID = #T13.ContractID
AND #T14.VersionNo=2
WHERE #T13.VersionNo=3


二月十六 2018-03-19
  • 打赏
  • 举报
回复
引用 8 楼 csdncainiaopx 的回复:
结果跟预期的是一样的了, 但是你的表结构有3张, 我的只有一张表结构, 不能应用你的sql语句,能帮我在改一下吗、谢谢
我改成一张了,就一个#T1了,你看#7的,对不对
2017_PX 2018-03-19
  • 打赏
  • 举报
回复
结果跟预期的是一样的了, 但是你的表结构有3张, 我的只有一张表结构, 不能应用你的sql语句,能帮我在改一下吗、谢谢
2017_PX 2018-03-19
  • 打赏
  • 举报
回复
因为我是一张表的结构,这样写我就没法应用你的T_SQL了
2017_PX 2018-03-19
  • 打赏
  • 举报
回复
你好,能否写在一个select 语句里面? 谢谢
二月十六 2018-03-19
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([ContractID] nvarchar(28),[VersionNo] int,[ProductCode] nvarchar(40),[Sequence] int,[Totalamount] int)
Insert #T1
select N'CS180195',1,N'42CN00530CALB',1,100 union all
select N'CS180195',1,N'4242CN00530CARB',2,200 union all
select N'CS180195',1,N'424230RQ130ACCSETBHS',3,300
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([ContractID] nvarchar(28),[VersionNo] int,[ProductCode] nvarchar(40),[Sequence] int,[Totalamount] int)
Insert #T2
select N'CS180195',2,N'424230RQ130ACCSETBHS',1,50 union all
select N'CS180195',2,N'424230RQ130ACCSETBH1',2,500 union all
select N'CS180195',2,N'424230RQ130ACCSETBH2',3,600 union all
select N'CS180195',2,N'424230RQ130ACCSETBH3',4,700 union all
select N'CS180195',2,N'424230RQ130ACCSETBH4',5,800
Go
if not object_id(N'Tempdb..#T3') is null
drop table #T3
Go
Create table #T3([ContractID] nvarchar(28),[VersionNo] int,[ProductCode] nvarchar(40),[Sequence] int,[Totalamount] int)
Insert #T3
select N'CS180195',3,N'424230RQ130ACCSETBHS',1,10 union all
select N'CS180195',3,N'424230RQ130ACCSETBH1',2,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH2',3,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH3',4,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH4',5,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH4',6,400
Go
--测试数据结束

SELECT * ,
Totalamount AS [difference]
FROM #T1
UNION ALL
SELECT #T2.* ,
CASE WHEN #T1.Totalamount IS NOT NULL
THEN #T2.Totalamount - #T1.Totalamount
ELSE #T2.Totalamount
END AS [difference]
FROM #T2
LEFT JOIN #T1 ON #T1.[Sequence] = #T2.[Sequence]
AND #T1.ContractID = #T2.ContractID
UNION ALL
SELECT #T3.* ,
CASE WHEN #T2.Totalamount IS NOT NULL
THEN #T3.Totalamount - #T2.Totalamount
ELSE #T3.Totalamount
END AS [difference]
FROM #T3
LEFT JOIN #T2 ON #T3.[Sequence] = #T2.[Sequence]
AND #T2.ContractID = #T3.ContractID


二月十六 2018-03-19
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([ContractID] nvarchar(28),[VersionNo] int,[ProductCode] nvarchar(40),[Sequence] int,[Totalamount] int)
Insert #T1
select N'CS180195',1,N'42CN00530CALB',1,100 union all
select N'CS180195',1,N'4242CN00530CARB',2,200 union all
select N'CS180195',1,N'424230RQ130ACCSETBHS',3,300
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([ContractID] nvarchar(28),[VersionNo] int,[ProductCode] nvarchar(40),[Sequence] int,[Totalamount] int)
Insert #T2
select N'CS180195',2,N'424230RQ130ACCSETBHS',1,50 union all
select N'CS180195',2,N'424230RQ130ACCSETBH1',2,500 union all
select N'CS180195',2,N'424230RQ130ACCSETBH2',3,600 union all
select N'CS180195',2,N'424230RQ130ACCSETBH3',4,700 union all
select N'CS180195',2,N'424230RQ130ACCSETBH4',5,800
Go
if not object_id(N'Tempdb..#T3') is null
drop table #T3
Go
Create table #T3([ContractID] nvarchar(28),[VersionNo] int,[ProductCode] nvarchar(40),[Sequence] int,[Totalamount] int)
Insert #T3
select N'CS180195',3,N'424230RQ130ACCSETBHS',1,10 union all
select N'CS180195',3,N'424230RQ130ACCSETBH1',2,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH2',3,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH3',4,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH4',5,400 union all
select N'CS180195',3,N'424230RQ130ACCSETBH4',6,400
Go
--测试数据结束
--1、
SELECT * ,
Totalamount AS [difference]
FROM #T1
--2、
SELECT #T2.* ,
CASE WHEN #T1.Totalamount IS NOT NULL
THEN #T2.Totalamount - #T1.Totalamount
ELSE #T2.Totalamount
END AS [difference]
FROM #T2
LEFT JOIN #T1 ON #T1.[Sequence] = #T2.[Sequence]
AND #T1.ContractID = #T2.ContractID
--3、
SELECT #T3.* ,
CASE WHEN #T2.Totalamount IS NOT NULL
THEN #T3.Totalamount - #T2.Totalamount
ELSE #T3.Totalamount
END AS [difference]
FROM #T3
LEFT JOIN #T2 ON #T3.[Sequence] = #T2.[Sequence]
AND #T2.ContractID = #T3.ContractID


2017_PX 2018-03-19
  • 打赏
  • 举报
回复
抱歉,合同号我没有统一, 关系列为ContractID, 你可以认为我给的合同都是 CS180195
二月十六 2018-03-19
  • 打赏
  • 举报
回复
第一版和第二版的关联关系是什么?怎么确定是同一个合同?

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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