首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求三表连接SQL,多谢

2013-06-19 
求三表连接SQL,在线等,谢谢!姓名表:ID姓名指标ID1小明12小李23小张1指标表:ID迟到指标早退指标旷课指标110

求三表连接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 行受影响)
*/

热点排行