+ -
当前位置:首页 → 问答吧 → 这个超级复杂的合并功能应该怎么实现

这个超级复杂的合并功能应该怎么实现

时间:2011-11-11

来源:互联网

一个账务系统中的凭证表中的数据是这样的:
日期 编号 顺序号 摘要 代码 部门 借金额 贷金额 附件张数
2011-11-1 101 1 张三 100301 4 500 0 2
2011-11-1 101 2 200001 0 500 2
2011-11-2 102 1 李四 100301 4 300 0 3
2011-11-2 102 2 王五 100301 5 400 0 3
2011-11-2 102 3 200001 0 700 3
2011-11-4 103 1 陈六 100301 4 700 0 1
2011-11-4 103 2 200002 700 1

主键为编号+顺序号,一个编号代表一张凭证,顺序号代码一张凭证里的分录,要求不同凭证号如果借方代码和贷方代码相同且借方向相同,就进行合并,合并后生成的凭证中的日期和编号取合并数据中的最大者,摘要按字符串连接处理,附件张数进行累加,比如编号为101的凭证第一条代码为100031,金额为借方500,第二张代码为200001,金额为贷方500,编号为102的凭证代码为100031,金额在借方,200001金额在贷方,因此二张凭证科目相同且借贷方向一致,可以合并;编号为103的凭证虽然代码为100031金额在借方,但贷方科目为200002,与101和102不同相,因此不能合并,

合并结果如下:
日期 编号 顺序号 摘要 代码 部门 借金额 贷金额 附件张数
2011-11-2 102 1 张三、李四 100301 4 800 0 5
2011-11-2 102 2 王五 100301 5 400 0 5
2011-11-2 102 3 200001 0 1200 5
2011-11-4 103 1 陈六 100301 4 700 0 1
2011-11-4 103 2 200002 700 1

作者: sybase2000   发布时间: 2011-11-11

字段太多,不写了,就是聚合加合并多行数据

作者: ssp2009   发布时间: 2011-11-11

呵呵,你的借方贷方在不同的记录,这个人判断还好对应,如果出现同一天借方贷方都出现多条记录怎么对应的

作者: Haiwer   发布时间: 2011-11-11

上一贴没说清楚,这一贴对应关系没说清楚

作者: Haiwer   发布时间: 2011-11-11

我是以一个编号表示一张凭证,一张凭证里有多个借贷,用顺序号来区分,合并就是以凭证为单位,如果凭证上A里面的借方科目和凭证上B里面的的借方科目相同,且凭证上A里面的贷方科目和凭证上B里面的的贷方科目相同,才能进行合并,因此合并时得先判断二张凭证的借方科目和贷方科目是否相同

作者: sybase2000   发布时间: 2011-11-11

一张凭证里一般最起码有二条记录,即一借一贷,也有可能是多借多贷,顺序号就表示借贷记录数

作者: sybase2000   发布时间: 2011-11-11

SQL code
use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([编号] int,[顺序号] int,[代码] int,[部门] int,[借金额] int,[贷金额] int,[摘要] nvarchar(200))
Insert #T
select 101,1,100301,4,500,0,N'张三' union all
select 101,2,200001,0,500,null,null union all
select 102,1,100301,4,300,0,N'王五' union all
select 102,2,100301,5,400,0,N'陈六' union all
select 102,3,200001,0,700,null,null union all
select 103,1,100401,2,600,0,N'周七' union all
select 103,2,200801,0,600,null,null

Go
Select [编号]=MAX([编号]),[顺序号]=MAX([顺序号]),[代码],[部门],SUM([借金额]) AS [借金额],ISNULL(RTRIM(SUM([贷金额])),'') AS [贷金额],
ISNULL(STUFF((SELECT ISNULL(''+[摘要],'') FROM #T WHERE [代码]=a.[代码] AND [部门]=a.[部门] FOR XML PATH('')),1,1,''),'') AS [摘要]
from #T AS a
GROUP BY [代码],[部门]
ORDER BY 1,2

/*
编号    顺序号    代码    部门    借金额    贷金额    摘要
102    1    100301    4    800    0    张三、王五
102    2    100301    5    400    0    陈六
102    3    200001    0    1200        
103    1    100401    2    600    0    周七
103    2    200801    0    600            
*/

作者: roy_88   发布时间: 2011-11-11

格式真亂,能把格式對齊麼

作者: roy_88   发布时间: 2011-11-11

我编辑的时候格式是对齐的,一发表就乱了,不知怎么回事

还有个附件张数没有加?

作者: sybase2000   发布时间: 2011-11-11

引用 8 楼 sybase2000 的回复:

我编辑的时候格式是对齐的,一发表就乱了,不知怎么回事

还有个附件张数没有加?

欄位都沒對上,你自己調整一下,沒有值的欄位用null

作者: roy_88   发布时间: 2011-11-11

一个账务系统中的凭证表中的数据是这样的:

日期 编号 顺序号 摘要 代码 部门 借金额 贷金额 附件张数
2011-11-1 101 1 张三 100301 4 500 0 2
2011-11-1 101 2 NULL 200001 NULL 0 500 2
2011-11-2 102 1 李四 100301 4 300 0 3
2011-11-2 102 2 王五 100301 5 400 0 3
2011-11-2 102 3 NULL 200001 NULL 0 700 3
2011-11-4 103 1 陈六 100301 4 700 0 1
2011-11-4 103 2 NULL 200002 NULL 0 700 1


合并结果如下:
日期 编号 顺序号 摘要 代码 部门 借金额 贷金额 附件张数
2011-11-2 102 1 张三、李四 100301 4 800 0 5
2011-11-2 102 2 王五 100301 5 400 0 5
2011-11-2 102 3 NULL 200001 NULL 0 1200 5
2011-11-4 103 1 陈六 100301 4 700 0 1
2011-11-4 103 2 NULL 200002 NULL 0 700 1


作者: sybase2000   发布时间: 2011-11-11

又重新编辑了一次,明明编辑的时候是对上的,发表后又对不上了,估计论坛处理有问题,非“所见即所得”

作者: sybase2000   发布时间: 2011-11-11