日期:2014-05-18  浏览次数:20411 次

左右表链接的存储过程功能实现
左右表链接的存储过程功能实现

数据表
1.员工表
工号 姓名
1 小明
2 小红
3 小白
......

2.A区记录表
编号 日期 销售员
1 2011-1-1 小明
2 2011-1-2 小明
3 2011-1-2 小红
4 2011-1-3 小明
......

3.B区记录表
编号 日期 销售员
1 2011-1-1 小明
2 2011-1-1 小白
3 2011-1-2 小明
4 2011-1-2 小白
5 2011-1-3 小红
......

/*条件:开始日期、结束日期*/
CREATE PROCEDURE [dbo].[Find_FT_YC]
@daeStart smalldatetime , @daeEnd smalldatetime 
as

例如daeStart = '2011-1-1'、daeEnd = '201-1-31'

搜索员工表记录
select * from 员工表
/*非记录尾时 ,不知是否正确*/
while 
  /*以下方法请大家赐教*/
  if not exists(select * from A区记录表 as a ... join B区记录表 as b on a.销售员 = b.销售员 and a.日期 = b.日期 where a.日期 between (@daeStart) and (@daeEnd)) 
  begin
  insert into #tmp (ID , 日期 , 销售员 , 区域) select ....
  end
wend

结果表:
编号 日期 销售员 A区记录 B区记录
1 2011-1-1 小明 1 1
2 2011-1-1 小红 0 0
3 2011-1-1 小白 0 1
4 2011-1-2 小明 1 1
5 2011-1-2 小红 1 0
6 2011-1-2 小白 0 1
7 2011-1-3 小明 1 0
8 2011-1-3 小红 1 0
9 2011-1-3 小白 0 0
10 2011-1-4 小明 0 0
11 2011-1-4 小红 0 0
12 2011-1-4 小白 0 0
......

我目前的想法是根据“员工表"及'开始日期与结束日期'生成临表
临时表 = 员工数 * (开始日期+结束日期)
临表再连接A区、B区记录表,有记录就更新临表对应的 A、B区记录字段
不过这个方法效率不太高,请大家赐教。


------解决方案--------------------
可以用master..spt_values生成时间字段left join 

------解决方案--------------------
AB表把日期union起来跟数据表的名字做笛卡尔积,再left join A B表
------解决方案--------------------
SQL code
create table 员工表(工号 int,姓名 varchar(10))
insert into 员工表 select 1,'小明'
insert into 员工表 select 2,'小红'
insert into 员工表 select 3,'小白'
create table A区记录表(编号 int,日期 datetime,销售员 varchar(10))
insert into A区记录表 select 1,'2011-1-1','小明'
insert into A区记录表 select 2,'2011-1-2','小明'
insert into A区记录表 select 3,'2011-1-2','小红'
insert into A区记录表 select 4,'2011-1-3','小明'
create table B区记录表(编号 int,日期 datetime,销售员 varchar(10))
insert into B区记录表 select 1,'2011-1-1','小明'
insert into B区记录表 select 2,'2011-1-1','小白'
insert into B区记录表 select 3,'2011-1-2','小明'
insert into B区记录表 select 4,'2011-1-2','小白'
insert into B区记录表 select 5,'2011-1-3','小红'
go
CREATE PROCEDURE [dbo].[Find_FT_YC]
@daeStart smalldatetime , @daeEnd smalldatetime  
as
begin
select c.工号,c.姓名,c.日期,
(case when d.销售员 is not null then 1 else 0 end)A区记录,
(case when e.销售员 is not null then 1 else 0 end)B区记录
from (
select a.工号,a.姓名,b.日期
from 员工表 a,(
select dateadd(d,number,@daeStart)日期 from master..spt_values
where type='p' and dateadd(d,number,@daeStart)<=@daeEnd
)b)c left join A区记录表 d on c.日期=d.日期 and c.姓名=d.销售员
left join B区记录表 e on c.日期=e.日期 and c.姓名=e.销售员
order by 3,1
end
go
exec [Find_FT_YC] '2011-1-1','2011-1-10'
/*
工号          姓名         日期                      A区记录        B区记录
----------- ---------- ----------------------- ----------- -----------
1           小明         2011-01-01 00:00:00     1           1
2           小红         2011-01-01 00:00:00     0           0
3           小白         2011-01-01 00:00:00     0           1
1           小明         2011-