这样的合并功能用SQL能实现吗?

sybase2000 2011-11-09 03:30:04
一个账务系统中凭证表中的数据是这样的:
编号 顺序号 代码 部门 借金额 贷金额
101 1 100301 4 500 0
101 2 200001 0 500
102 1 100301 4 300 0
102 2 100301 5 400 0
102 3 200001 0 700


主键为编号+顺序号,一个编号代表一张凭证,顺序号代码一张凭证里的分录,要求不同凭证号如果借方代码和贷方代码相同,就进行合并,合并的结果如下:

编号 顺序号 代码 部门 借金额 贷金额
201 1 100301 4 800 0
201 2 100301 5 400 0
201 3 200001 0 1200
...全文
67 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2011-11-11
  • 打赏
  • 举报
回复
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
*/
sybase2000 2011-11-09
  • 打赏
  • 举报
回复
谢谢大家的回复,基本有了思路,但可能发贴时没考虑周全,现在重新表述一下:

一个账务系统中凭证表中的数据是这样的(一共有三张凭证上,一个编号代码一张凭证,顺序号代表凭证的分录):
编号 顺序号 代码 部门 借金额 贷金额 摘要
101 1 100301 4 500 0 张三
101 2 200001 0 500
102 1 100301 4 300 0 王五
102 2 100301 5 400 0 陈六
102 3 200001 0 700
103 1 100401 2 600 0 周七
103 2 200801 0 600

主键为编号+顺序号,一个编号代表一张凭证,顺序号代码一张凭证里的分录,要求不同凭证号如果借方代码和贷方代码相同,就进行合并,合并后新的凭证号为这几笔合并凭证中凭证号最大的,有摘要的话进行字符连接,结果如下:

编号 顺序号 代码 部门 借金额 贷金额 摘要
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




中国风 2011-11-09
  • 打赏
  • 举报
回复
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)
Insert #T
select 101,1,100301,4,500,0 union all
select 101,2,200001,0,500,null union all
select 102,1,100301,4,300,0 union all
select 102,2,100301,5,400,0 union all
select 102,3,200001,0,700,null
Go
Select [编号]=MAX([编号]),[顺序号]=MAX([顺序号]),[代码],[部门],SUM([借金额]) AS [借金额],SUM([贷金额]) AS [贷金额]
from #T
GROUP BY [代码],[部门]
ORDER BY 2

/*
编号 顺序号 代码 部门 借金额 贷金额
102 1 100301 4 800 0
102 2 100301 5 400 0
102 3 200001 0 1200 NULL
*/
--小F-- 2011-11-09
  • 打赏
  • 举报
回复
借方代码和贷方代码这些在哪里体现?
黄_瓜 2011-11-09
  • 打赏
  • 举报
回复
select 代码,部门,借金额,贷金额,sum(借金额),sum(贷金额) from tb group by 代码,部门
-晴天 2011-11-09
  • 打赏
  • 举报
回复
select 代码,sum(借金额),sum(贷金额) from tb group by 代码
如果部门和编号什么都不同,合并后不能有.

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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