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

请教一条简单的查询语句,非常感谢

不同的班有重名的人,同一个班没有重名的,班级和姓名是联合主键

租借表
姓名 班级 性别 借书数量(int类型)
张三 一班 男 10
李四 二班 女 7
张三 二班 女 5
李四 一班 男 3
张三 一班 男 5


归还表
姓名 班级 性别 还书数量(int类型)
张三 一班 男 9
李四 二班 女 5
张三 二班 女 2
李四 一班 男 1
张三 一班 男 3


查找现在所有人欠书本数为1-3本的且性别为女的查询结果

显示结果为:
姓名 班级 性别 仍欠数量
......

------解决方案--------------------
SQL code
SELECT T1.[姓名],T1.[班级],T1.[性别],T1.[借书数量]-ISNULL(T2.[还书数量],0) AS 仍欠数量
FROM [租借表] T1
LEFT JOIN [归还表] T2 ON T1.[姓名]=T2.[姓名] AND T1.[班级]=T2.[班级]
AND T1.[借书数量]-ISNULL(T2.[还书数量],0) BETWEEN 1 AND 3

------解决方案--------------------
SQL code
select 
    a.*,a.借书数量-ISNULL(b.还书数量,0) as 仍欠数量
from (select 姓名,班级,性别,SUM(借书数量) as 借书数量 from 租借表 where 性别='女' group by 姓名,班级,性别) as a
left join (select 姓名,班级,SUM(还书数量) as 还书数量 from 归还表 where 性别='女' group by 姓名,班级) as b on a.姓名=b.姓名 and a.班级=b.班级
where a.借书数量-ISNULL(b.还书数量,0) between 1 and 3

------解决方案--------------------
select 
a.*,a.借书数量-ISNULL(b.还书数量,0) as 仍欠数量
from (select 姓名,班级,性别,SUM(借书数量) as 借书数量 from 租借表 where 性别='女' group by 姓名,班级,性别) as a
left join (select 姓名,班级,SUM(还书数量) as 还书数量 from 归还表 where 性别='女' group by 姓名,班级) as b on a.姓名=b.姓名 and a.班级=b.班级
where a.借书数量-ISNULL(b.还书数量,0) between 1 and 3

------解决方案--------------------
SQL code

if object_id('租借表') is not null
   drop table 租借表
go
create table 租借表
(
 姓名 varchar(10),
 班级 varchar(10),
 性别 varchar(10),
 借书数量 int
)
go
insert into 租借表
select '张三','一班','男',10 union all
select '李四','二班','女',7 union all
select '张三','二班','女',5 union all
select '李四','一班','男',3 union all
select '张三','一班','男',5
go
if object_id('归还表') is not null
   drop table 归还表
go
create table 归还表
(
 姓名 varchar(10),
 班级 varchar(10),
 性别 varchar(10),
 还书数量 int
)
go
insert into 归还表
select '张三','一班','男',9 union all
select '李四','二班','女',5 union all
select '张三','二班','女',2 union all
select '李四','一班','男',1 union all
select '张三','一班','男',3
go
select * from 
(
 select 姓名,班级,欠书本数=sum(借书数量)-(select sum(还书数量) from 归还表 where 班级=a.班级 and 姓名=a.姓名) from 租借表 a where 性别='女' group by 班级,姓名
) t where 欠书本数<=3
go
/*
姓名         班级         欠书本数
---------- ---------- -----------
李四         二班         2
张三         二班         3

(2 行受影响)
*/

------解决方案--------------------
+1
探讨
SQL code

if object_id('租借表') is not null
drop table 租借表
go
create table 租借表
(
姓名 varchar(10),
班级 varchar(10),
性别 varchar(10),
借书数量 int
)
go
insert into 租借表
select '张三','一班','男',1……

------解决方案--------------------
探讨
错了,最后一个AND应该是WHERE

SQL code

SELECT T1.[姓名],T1.[班级],T1.[性别],T1.[借书数量]-ISNULL(T2.[还书数量],0) AS 仍欠数量
FROM [租借表] T1
LEFT JOIN [归还表] T2 ON T1.[姓名]=T2.[姓名] AND T1.[班级]=T2.[班级]
WHERE T1.[借书数量]-ISNULL……

------解决方案--------------------
SELECT T1.[姓名],T1.[班级],T1.[性别],T1.[借书数量]-ISNULL(T2.[还书数量],0) AS 仍欠数量
FROM [租借表] T1
LEFT JOIN [归还表] T2 ON T1.[姓名]=T2.[姓名] AND T1.[班级]=T2.[班级]and T2 .[性别] ='女'
WHERE T1.[借书数量]-ISNULL(T2.[还书数量],0) BETWEEN 1 AND 3
and T1.[性别] ='女'
------解决方案--------------------
运行结果
姓名 班级 性别 仍欠数量
李四 二班 女 2
张三 二班 女 1
------解决方案--------------------
SQL code

select m.姓名,
       m.班级, 
       m.性别, 
       m.借书数量 - n.还书数量 仍欠数量
from 租借表 m , 归还表 n
where m.姓名 = n.姓名 and m.班级 = n.班级 and m.性别 = '女' and m.借书数量 - n.还书数量 between 1 and 3