Sql 关联查询统计案例

原论坛贴子地址:点击打开链接

 http://topic.csdn.net/u/20120811/18/7f0f6a7e-f7b7-4e23-beaf-fd4afe5d5260.html?seed=843166364&r=79380390#r_79380390
   


 
 /********************************************************************************             
 *主题: SQl 2008/2005 论坛问题解答             
 *说明:本文是个人学习的一些笔记和个人愚见              
 *      有很多地方你可能觉得有异议,欢迎一起讨论              
              
 *作者:Stephenzhou(阿蒙)              
 *日期: 2012.08.11          
 *Mail:[email protected]              
 *另外:转载请著名出处。              
**********************************************************************************/   
 



--用到两个表,teacher,student和class

--teacher的字段和值如下:
--id name sex
--1 王老师 男
--2 李老师 男
--3 余老师 女
--4 张老师 女
if OBJECT_ID('teacher') is not null
drop table teacher
go
create table teacher (id int ,name varchar(10),sex char(2))
insert into teacher values(1 ,'王老师' ,'男')
insert into teacher values(2 ,'李老师', '男')
insert into teacher values(3 ,'余老师', '女')
insert into teacher values(4 ,'张老师' ,'女')

--student的字段和值如下:
--id name teacherId
--1 张三 1
--2 李四 1
--3 王五 2
--4 宋六 1
--5 郑七 2

if OBJECT_ID('student') is not null
drop table student
go
create table student (id int, name varchar(10),techerId int)
insert into student values(1,'张三' ,1)
insert into student values(2,'李四' ,1)
insert into student values(3,'王五' ,2)
insert into student values(4,'宋六' ,1)
insert into student values(5,'郑七', 2)


--class的字段和值如下:
--id name teacherId
--1 初二一班 1
--2 初二三班 1
--3 初三一班 3
--4 初一三班 4
--5 初三三班 2
if OBJECT_ID('class') is not null
drop table class
go
create table class (id int,name varchar(10), techerId int)
insert into class values(1, '初二一班', 1)
insert into class values(2 ,'初二三班', 1)
insert into class values(3, '初三一班', 3)
insert into class values(4, '初一三班', 4)
insert into class values(5, '初三三班', 2)

--我想查出每个老师在表student和class中出现的次数加老师本身的资料,比如这个例子的结果显示为:
--name students classes
--王老师 3 2
--李老师 2 1
--余老师 0 1
--张老师 0 1
--这个SQL语句怎么写?
--谢谢!
  
  
  --第一种方法
 
select t.name,count(distinct(s.id)) as students,count(distinct(c.name)) as classes from teacher t left join student s on t.id=s.techerId left join class c on t.id=c.techerId 
 group by t.name
 
 
 /*
 name       students    classes
---------- ----------- -----------
李老师        2           1
王老师        3           2
余老师        0           1
张老师        0           1
 */
 
 
 --第二种方法
 select t.name,t.sex,
       (select count(1) from student s where s.techerId=t.id) 'students',
       (select count(1) from class c where c.techerId=t.id) 'classes'   
from teacher t


/*
name       sex  students    classes
---------- ---- ----------- -----------
王老师        男    3           2
李老师        男    2           1
余老师        女    0           1
张老师        女    0           1

(4 行受影响)


*/

 


 *作者:Stephenzhou(阿蒙)     
 *日期: 2012.08.6
 *Mail:[email protected]     
 *另外:转载请著名出处。
 *博客地址:http://blog.csdn.net/szstephenzhou

 

 

 

 

 

你可能感兴趣的:(Sql 关联查询统计案例)