左右表链接的存储过程功能实现
数据表
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','小红'goCREATE PROCEDURE [dbo].[Find_FT_YC]@daeStart smalldatetime , @daeEnd smalldatetime asbeginselect 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_valueswhere type='p' and dateadd(d,number,@daeStart)<[email protected])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,1endgoexec [Find_FT_YC] '2011-1-1','2011-1-10'/*工号 姓名 日期 A区记录 B区记录----------- ---------- ----------------------- ----------- -----------1 小明 2011-01-01 00:00:00 1 12 小红 2011-01-01 00:00:00 0 03 小白 2011-01-01 00:00:00 0 11 小明 2011-01-02 00:00:00 1 12 小红 2011-01-02 00:00:00 1 03 小白 2011-01-02 00:00:00 0 11 小明 2011-01-03 00:00:00 1 02 小红 2011-01-03 00:00:00 0 13 小白 2011-01-03 00:00:00 0 01 小明 2011-01-04 00:00:00 0 02 小红 2011-01-04 00:00:00 0 03 小白 2011-01-04 00:00:00 0 01 小明 2011-01-05 00:00:00 0 02 小红 2011-01-05 00:00:00 0 03 小白 2011-01-05 00:00:00 0 01 小明 2011-01-06 00:00:00 0 02 小红 2011-01-06 00:00:00 0 03 小白 2011-01-06 00:00:00 0 01 小明 2011-01-07 00:00:00 0 02 小红 2011-01-07 00:00:00 0 03 小白 2011-01-07 00:00:00 0 01 小明 2011-01-08 00:00:00 0 02 小红 2011-01-08 00:00:00 0 03 小白 2011-01-08 00:00:00 0 01 小明 2011-01-09 00:00:00 0 02 小红 2011-01-09 00:00:00 0 03 小白 2011-01-09 00:00:00 0 01 小明 2011-01-10 00:00:00 0 02 小红 2011-01-10 00:00:00 0 03 小白 2011-01-10 00:00:00 0 0(30 行受影响)*/godrop procedure find_ft_ycdrop table 员工表,A区记录表,B区记录表