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

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

2012-02-02 
请教一条简单的查询语句,非常感谢不同的班有重名的人,同一个班没有重名的,班级和姓名是联合主键租借表姓名

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

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

租借表
姓名班级性别借书数量(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 [租借表] T1LEFT 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 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

[解决办法]
SQL code
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
探讨
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 , 归还表 nwhere m.姓名 = n.姓名 and m.班级 = n.班级 and m.性别 = '女' and m.借书数量 - n.还书数量 between 1 and 3 


[解决办法]

SQL code
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
*/

热点排行
Bad Request.