当前位置: 代码迷 >> Sql Server >> 经过SQL合并表格难题
  详细解决方案

经过SQL合并表格难题

热度:39   发布时间:2016-04-24 10:55:58.0
通过SQL合并表格难题
有2个表,表A记录如下:
 序号 日期  金额 户名 帐号   备注
1 2012-3-3  130 张三 11111 发工资
2 2012-3-4  140 李四 22222 发奖金
3 2012-3-5  150 王五 33333 发补贴
4 2012-3-3  130 张三 11111 发工资

 表B记录如下
 序号1 日期1 金额1 户名1 帐号1 备注1
1 2012-3-3  130  张三  11111  再发工资
2 2012-3-3  130  张三  11111  再发工资
3 2012-3-5  150  黄六  66666  发补贴

 如何通过SQL SERVER 命令,根据日期、金额和户名相等,两表核对生成以下结果

 序号 日期  金额 户名 帐号  备注 序号1 日期1 金额1 户名1 帐号1 备注1
1 2012-3-3 130 张三 11111 发工资  1  2012-3-3 130  张三  11111  再发工资
2 2012-3-4 140 李四 22222 发奖金 
3 2012-3-5 150 王五 33333 发补贴 
4 2012-3-3 130 张三 11111 发工资  2  2012-3-3 130 张三   11111  再发工资

主要的问题是按核对字段(日期、金额和户名)表B有相同的记录,如何避免表B中第1笔记录再次与表A中第4笔记录匹配上.

通过以下SQL命令无法实现
select DISTINCT A.*,B.[户名1],B.[金额1],B.[户名1],B.[帐号1],B.[备注1]
from [A] LEFT JOIN [B] ON A.[日期]=B.[日期1] AND A.[金额]=B.[金额1] AND A.[户名]=B.[户名1]
结果是如下:请注意“序号1”,表B中的第2笔记录没有与表1中的第4笔记录核对上:

序号     日期   金额   户名   帐号   备注   序号1     户名1     金额1         户名1  帐号1         备注1
 ----------- ----------------------- ----------- ---- ----------- ------ ---- ----------- ---- ----------- --------
1    2012-03-03  130  张三   11111   发工资   1    张三   130         张三   11111       再发工资
2    2012-03-04  140  李四   22222   发奖金        NULL NULL        NULL NULL        NULL
3    2012-03-03  130  张三   11111   发工资   1    张三   130         张三   11111       再发工资


有高手提出
select 序号,日期,金额, 户名,帐号,备注,序号1,日期1,金额1, 户名1,帐号1,备注1
 from (select rn=row_number() over (partition by 帐号 order by 日期,序号)from 表A) a,
 left join  (select rn=row_number() over (partition by 帐号1 order by 日期1,序号1)from 表B) b
 on a.rn=b.rn and a.帐号=b.帐号 
上述指令无法执行,请各位看客高手指教,谢谢!
------解决方案--------------------
--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] ([序号] int,[日期] datetime,[金额] int,[户名] varchar(4),[帐号] int,[备注] varchar(6))
insert into [tb]
select 1,'2012-3-3',130,'张三',11111,'发工资' union all
select 2,'2012-3-4',140,'李四',22222,'发奖金' union all
select 3,'2012-3-5',150,'王五',33333,'发补贴' union all
select 4,'2012-3-3',130,'张三',11111,'发工资'

--select * from [tb]

--> 测试数据: [tc]
if object_id('[tc]') is not null drop table [tc]
create table [tc] ([序号1] int,[日期1] datetime,[金额1] int,[户名1] varchar(4),[帐号1] int,[备注1] varchar(8))
insert into [tc]
select 1,'2012-3-3',130,'张三',11111,'再发工资' union all
select 2,'2012-3-3',130,'张三',11111,'再发工资' union all
select 3,'2012-3-5',150,'黄六',66666,'发补贴'

--select * from [tc]

;
with 
wang1 as (select rowid=ROW_NUMBER() over(PARTITION by 户名 order by 序号),* from tb),
wang2 as (select rowid=ROW_NUMBER() over(PARTITION by 户名1 order by 序号1),* from tc)

select * 
from wang1 left join wang2 on wang1.rowid=wang2.rowid and wang1.户名=wang2.户名1


1 2 2012-03-04 00:00:00.000 140 李四 22222 发奖金 NULL NULL NULL NULL NULL NULL NULL
1 3 2012-03-05 00:00:00.000 150 王五 33333 发补贴 NULL NULL NULL NULL NULL NULL NULL
1 1 2012-03-03 00:00:00.000 130 张三 11111 发工资 1 1 2012-03-03 00:00:00.000 130 张三 11111 再发工资
2 4 2012-03-03 00:00:00.000 130 张三 11111 发工资 2 2 2012-03-03 00:00:00.000 130 张三 11111 再发工资
  相关解决方案