请教一条简单的查询语句,非常感谢
不同的班有重名的人,同一个班没有重名的,班级和姓名是联合主键
租借表
姓名班级性别借书数量(int类型)
张三一班男10
李四二班女7
张三二班女5
李四一班男3
张三一班男5
归还表
姓名班级性别还书数量(int类型)
张三一班男9
李四二班女5
张三二班女2
李四一班男1
张三一班男3
查找现在所有人欠书本数为1-3本的且性别为女的查询结果
显示结果为:
姓名班级性别仍欠数量
......
[解决办法]
SELECT T1.[姓名],T1.[班级],T1.[性别],T1.[借书数量]-ISNULL(T2.[还书数量],0) AS 仍欠数量FROM [租借表] T1LEFT JOIN [归还表] T2 ON T1.[姓名]=T2.[姓名] AND T1.[班级]=T2.[班级]AND T1.[借书数量]-ISNULL(T2.[还书数量],0) BETWEEN 1 AND 3
[解决办法]
select a.*,a.借书数量-ISNULL(b.还书数量,0) as 仍欠数量from (select 姓名,班级,性别,SUM(借书数量) as 借书数量 from 租借表 where 性别='女' group by 姓名,班级,性别) as aleft 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
[解决办法]
if object_id('租借表') is not null drop table 租借表gocreate table 租借表( 姓名 varchar(10), 班级 varchar(10), 性别 varchar(10), 借书数量 int)goinsert into 租借表select '张三','一班','男',10 union allselect '李四','二班','女',7 union allselect '张三','二班','女',5 union allselect '李四','一班','男',3 union allselect '张三','一班','男',5goif object_id('归还表') is not null drop table 归还表gocreate table 归还表( 姓名 varchar(10), 班级 varchar(10), 性别 varchar(10), 还书数量 int)goinsert into 归还表select '张三','一班','男',9 union allselect '李四','二班','女',5 union allselect '张三','二班','女',2 union allselect '李四','一班','男',1 union allselect '张三','一班','男',3goselect * from ( select 姓名,班级,欠书本数=sum(借书数量)-(select sum(还书数量) from 归还表 where 班级=a.班级 and 姓名=a.姓名) from 租借表 a where 性别='女' group by 班级,姓名) t where 欠书本数<=3go/*姓名 班级 欠书本数---------- ---------- -----------李四 二班 2张三 二班 3(2 行受影响)*/
[解决办法]
+1
select m.姓名, m.班级, m.性别, m.借书数量 - n.还书数量 仍欠数量from 租借表 m , 归还表 nwhere m.姓名 = n.姓名 and m.班级 = n.班级 and m.性别 = '女' and m.借书数量 - n.还书数量 between 1 and 3
[解决办法]
create table 租借表( 姓名 varchar(10), 班级 varchar(10), 性别 varchar(10), 借书数量 int)goinsert into 租借表select '张三','一班','男',10 union allselect '李四','二班','女',7 union allselect '张三','二班','女',5 union allselect '李四','一班','男',3 union allselect '张三','一班','男',5create table 归还表( 姓名 varchar(10), 班级 varchar(10), 性别 varchar(10), 还书数量 int)insert into 归还表select '张三','一班','男',9 union allselect '李四','二班','女',5 union allselect '张三','二班','女',2 union allselect '李四','一班','男',1 union allselect '张三','一班','男',3select m.姓名, m.班级, m.性别, m.借书数量 - n.还书数量 仍欠数量from 租借表 m , 归还表 nwhere m.姓名 = n.姓名 and m.班级 = n.班级 and m.性别 = '女' and m.借书数量 - n.还书数量 between 1 and 3drop table 租借表 ,归还表/*姓名 班级 性别 仍欠数量 ---------- ---------- ---------- ----------- 李四 二班 女 2张三 二班 女 3(所影响的行数为 2 行)*/
[解决办法]
'班级和姓名是联合主键',楼主这题数据是不是有问题?建立联合主键,怎么还能出现相同的插入数据:
租借表
姓名 班级 性别 借书数量(int类型)
张三 一班 男 10
李四 二班 女 7
张三 二班 女 5
李四 一班 男 3
张三 一班 男 5
归还表
姓名 班级 性别 还书数量(int类型)
张三 一班 男 9
李四 二班 女 5
张三 二班 女 2
李四 一班 男 1
张三 一班 男 3
[解决办法]
--租借表
go
if object_id('租借表') is not null
drop table 租借表
go
create table 租借表(
姓名 varchar(20) not null,
班级 varchar(20) not null,
性别 varchar(5) check(性别 in('男','女')),
借书数量 int default 0
)
go
alter table 租借表 add constraint pk_name_class primary key(姓名,班级)
go
insert 租借表
select '张三','一班','男',10 union all
select '李四','二班','女',7 union all
select '张三','二班','女',5 union all
select '李四','一班','男',3
--归还表
go
if object_id('归还表') is not null
drop table 归还表
go
create table 归还表(
姓名 varchar(20) not null,
班级 varchar(20) not null,
性别 varchar(5) check(性别 in('男','女')),
还书数量 int default 0
)
go
alter table 归还表 add constraint pk_n_c primary key(姓名,班级)
go
insert 归还表
select '张三','一班','男',9 union all
select '李四','二班','女',5 union all
select '张三','二班','女',2 union all
select '李四','一班','男',1
select *from 归还表
--查找现在所有人欠书本数为1-3本的且性别为女的查询结果
--显示结果为:
--姓名 班级 性别 仍欠数量
select
租借表.姓名,租借表.班级,
租借表.性别,(租借表.借书数量-归还表.还书数量) as 仍欠数量
from
租借表 inner join 归还表
on
租借表.姓名=归还表.姓名 and 租借表.班级=归还表.班级
/*
--结果表
姓名 班级 性别 仍欠数量
李四二班女 2
李四一班男 2
张三二班女 3
张三一班男 1
*/