永发信息网

sql中多表联结问题?

答案:1  悬赏:50  手机版
解决时间 2021-05-07 09:03

实现如下第一题:

我有如下方法可实现,但感觉太复杂了,求简便方法!

select mname as 姓名,isnull(yuwen,0) as 语文,isnull(shuxue,0) as 数学,isnull(yinyu,0) as 英语,isnull(lishi,0) as 历史
from score
--语文
left join
(select score.Fid,score.MID,Score as yuwen from score left join f on f.Fid = score.fid where fname = '语文') as yuwen
on yuwen.mid = score.mid
--数学
left join
(select score.Fid,score.MID,Score as shuxue from score left join f on f.Fid = score.fid where fname = '数学') as shuxue
on shuxue.mid = score.mid
--英语
left join
(select score.Fid,score.MID,Score as yinyu from score left join f on f.Fid = score.fid where fname = '英语') as yinyu
on yinyu.mid = score.mid
--历史
left join
(select score.Fid,score.MID,Score as lishi from score left join f on f.Fid = score.fid where fname = '英语') as lishi
on lishi.mid = score.mid

left join member on score.mid = member.mid
--分组
group by member.mname,isnull(yuwen,0),isnull(shuxue,0),isnull(yinyu,0),isnull(lishi,0)

最佳答案

select 姓名 = M.MName,
语文 = min(case
when F.FName = '语文' then convert(varchar(10),S.Score)
else '缺考'
end),
数学 = min(case
when F.FName = '数学' then convert(varchar(10),S.Score)
else '缺考'
end),
英语 = min(case
when F.FName = '英语' then convert(varchar(10),S.Score)
else '缺考'
end),
历史 = min(case
when F.FName = '历史' then convert(varchar(10),S.Score)
else '缺考'
end)
from Score as S inner join Course as F on (S.FID = F.FID)
inner join Member as M on (M.MID = S.MID)
group by M.MName


--查询考试同学中成绩低于70分的学员姓名和所对应的科目
select 姓名 = M.MName,科目 = F.FName,成绩 = S.Score
from Score as S inner join Course as F on (S.FID = F.FID)
inner join Member as M on (M.MID = S.MID) where S.Score < 70


--统计参加考试的学生的平均分并按平均分 降序排列
select 姓名 = M.MName,平均成绩 = sum(S.Score)/4
from Member as M inner join Score as S on (M.MID = S.MID)
group by M.MName
order by sum(S.Score)/4 desc


--创建存储过程 查询参加1,2,3,4及没有参加考试的学员的姓名和学号
create procedure usp_Search
@joinNum int = 4
as
--参见考试的数目不等于零的情况
if(@joinNum > 0)
begin
select 姓名 = M.MName,学号 = M.MID
from Member as M inner join Score as S on (M.MID = S.MID)
group by M.MName,M.MID
having count(S.MID) = @joinNum
end
else --未参加考试的学员姓名
begin
select 姓名 = M.MName,学号 = M.MID
from Member as M inner join Score as S
on M.MID not in (select MID from Score)
group by M.MName,M.MID
end
go


--调用存储过程 查询信息
EXEC usp_Search 2

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
笔记本电视机多少钱
天之红祁门红茶淄川专卖店我想知道这个在什么
金希澈有没有被公司雪藏?
怎样才能把dnf速度加上去呀 不买时装
QQ被盗后要打什么电话才能找回
现在抢车位最高等级是多少级?
爱情豆可以从好友家偷吗
脚部骨折除了打石膏还有什么注意事项
DNF小小还能不能用?
80后的我们如经是不是该承认自己以经不在年亲
凌云房地产开发有限公司在什么地方啊,我要过
湖南吉首人办湖南吉首摩托车驾驶证要多少钱
物流管理专业薪水最高的方向是什么?能有多少
我从小关节时不时疼痛是怎么回事啊?
汽油机和柴油机有哪些具体的优势和劣势,现在
推荐资讯
超感警探 第三季什么时候出?Red John 到底是
为什么我们以前相爱,到最后会变成谁也不理谁
我的多功能读卡器在家的电脑上读不了任何卡,
怎么加入环保组织,所以我想加入环保组织英文
汕头存心善堂有对外招收轻度残疾儿童没有
小蔡汽车影音灯改装美容地址有知道的么?有点
世界上最牛逼的动物
刘德华和她老婆是怎么曝光的啊?
GTA4MOD下载地址
穿越火线怎么玩?
谭杰稀进没进入快男三强
怎样的女孩才算有气质,像我这样温柔、善良、
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?