zhang_meixia 2015-05-15 03:45 采纳率: 44.4%
浏览 2396
已采纳

SQL case语句如何执行的

有张学生表
S# SName
1 小美
2 小坡
3 李明

有张课程
C# Cname
01 语文
02 数学
03 英语

有张成绩表
S# C# Score
1 01 98
1 02 85
1 03 56
2 01 100
2 02 56
2 03 65
3 01 60
3 02 56
3 03 45

用SQL语句写出所有学生的所有课程的成绩,
SQL语句如下:
select a.S# 学生编号, a.Sname 学生姓名,
max(case c.Cname when N'语文' then b.score else null end) [语文],
max(case c.Cname when N'数学' then b.score else null end) [数学],
max(case c.Cname when N'英语' then b.score else null end) [英语]
from Student a
left join SC b on a.S# = b.S#
left join Course c on b.C# = c.C#
group by a.S# , a.Sname
order by a.S#

得出的结果示例如下:
学生编号 学生姓名 语文 数学 英语
01 赵雷 80 90 99
02 钱电 70 60 80
03 孙风 80 80 80

我不明白的为什么上面的SQL语句能得到正确结果。
首先上面的SQL语句连接后,有个类似于这样的表
学生编号 学生姓名 课程 分数
01 小美 语文 20
01 小美 数学 30
01 小美 英语 40
02 小丽 语文 25
02 小丽 数学 35
02 小丽 英语 99

然后一条一条地执行表中的数据,第一条数据,确实是语文,可以得到语文分数
然后再执行第二个Case ,应该显示结果为null啊…好乱

我想知道 case语句是如何执行 得到正确结果的

  • 写回答

2条回答 默认 最新

  • danielinbiti 2015-05-15 04:04
    关注

    你这问题是因为max原因,你把语句拆一下就理解过程了

    1、去掉group by和max,得到的就是你理解的过程
    select a.S# 学生编号, a.Sname 学生姓名,
    case c.Cname when N'语文' then b.score else null end [语文],
    case c.Cname when N'数学' then b.score else null end [数学],
    case c.Cname when N'英语' then b.score else null end [英语]
    from Student a 
    left join SC b on a.S# = b.S#
    left join Course c on b.C# = c.C#
    order by a.S#
    
     2、再第一步基础上进行人员分组和MAX取每列最大值,得到每门课的最大值。就是case when中没列唯一有值的。
     select a.S# 学生编号, a.Sname 学生姓名,
    max(case c.Cname when N'语文' then b.score else null end) [语文],
    max(case c.Cname when N'数学' then b.score else null end) [数学],
    max(case c.Cname when N'英语' then b.score else null end) [英语]
    from Student a 
    left join SC b on a.S# = b.S#
    left join Course c on b.C# = c.C#
    group by a.S# , a.Sname
    order by a.S#
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突