求三表连接SQL,在线等,谢谢!
姓名表:
ID 姓名 指标ID
1 小明 1
2 小李 2
3 小张 1
指标表:
ID 迟到指标 早退指标 旷课指标
1 10 5 5
2 20 10 5
实际表:
ID 日期 姓名ID 实际迟到 实际早退 实际旷课
1 2013-04-01 1 5 0 3
2 2013-5-10 3 0 2 5
==============================================================================
按日期区间查询:区间为上月26日至本月25日
查询2013年3月26日至2013年4月25日之间结果:
姓名 迟到指标 实际迟到 早退指标 实际早退 旷课指标 实际旷课
小明 10 5 5 0 5 3
小李 20 10 5
小张 10 5 5
SQL 表连接
[解决办法]
create table 姓名表
(ID int, 姓名 varchar(10), 指标ID int)
insert into 姓名表
select 1, '小明', 1 union all
select 2, '小李', 2 union all
select 3, '小张', 1
create table 指标表
(ID int, 迟到指标 int, 早退指标 int, 旷课指标 int)
insert into 指标表
select 1, 10, 5, 5 union all
select 2, 20, 10, 5
create table 实际表
(ID int, 日期 date, 姓名ID int, 实际迟到 int, 实际早退 int, 实际旷课 int)
insert into 实际表
select 1, '2013-04-01', 1, 5, 0, 3 union all
select 2, '2013-5-10', 3, 0, 2, 5
select a.姓名,
b.迟到指标,
isnull(rtrim(c.实际迟到),'') '实际迟到',
b.早退指标,
isnull(rtrim(c.实际早退),'') '实际早退',
b.旷课指标,
isnull(rtrim(c.实际旷课),'') '实际旷课'
from 姓名表 a
inner join 指标表 b on a.指标ID=b.ID
left join
(select 姓名ID,
sum(实际迟到) '实际迟到',
sum(实际早退) '实际早退',
sum(实际旷课) '实际旷课'
from 实际表
where 日期 between '2013-03-26' and '2013-04-25'
group by 姓名ID
) c on a.ID=c.姓名ID
/*
姓名 迟到指标 实际迟到 早退指标 实际早退 旷课指标 实际旷课
---------- ----------- ------------ ----------- ------------ ----------- ------------
小明 10 5 5 0 5 3
小李 20 10 5
小张 10 5 5
(3 row(s) affected)
*/
select b.姓名,a.迟到指标,IsNULL(c.实际迟到,0)实际迟到,a.早退指标,IsNULL(c.实际早退,0)实际早退,a.旷课指标,IsNULL(c.实际旷课,0)实际旷课
from [指标表] a inner join [姓名表] b on a.ID=b.指标ID
left join (select d.姓名ID,d.实际迟到,d.实际旷课,d.实际早退 from [实际表] d
where d.日期 between '2013-03-26' and '2013-04-25') c on c.姓名ID=b.ID
/*
姓名 迟到指标 实际迟到 早退指标 实际早退 旷课指标 实际旷课
---------- ----------- ----------- ----------- ----------- ----------- -----------
小明 10 5 5 0 5 3
小李 20 0 10 0 5 0
小张 10 0 5 0 5 0
(3 行受影响)
*/