哪位好心人给我解释下这段代码,实在看不懂。

wanggang_sql 2012-12-06 05:34:46
select student as 姓名,
max(case course when '语文' then score else 0 end) 语文,
max(case course when '数学' then score else 0 end) 数学,
max(case course when '物理' then score else 0 end) 物理,
MAX(case course when '英语' then score else 0 end) 英语,
cast(avg(score*1.0) as decimal(18,2)) 平均分,
sum(score) 总分
from class
group by student

结果为:
姓名 语文 数学 物理 英语 平均分 总分
1 李四 65 77 85 65 73.00 292
2 张三 78 87 90 82 84.25 337


这条查询语句怎么理解啊,菜鸟,谢谢,最好逐句解释哦 呵呵
...全文
212 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaxuelian 2012-12-11
  • 打赏
  • 举报
回复
统计每个学生的每一科的成绩、平均分与总分
青春code 2012-12-08
  • 打赏
  • 举报
回复
按照学生名字分组,并求出每个学生的各科成绩就平均分和总分
坚_持 2012-12-08
  • 打赏
  • 举报
回复
不好意思 先发的有误
坚_持 2012-12-08
  • 打赏
  • 举报
回复
learningcoder 2012-12-07
  • 打赏
  • 举报
回复
介个是行转列呀
wanggang_sql 2012-12-07
  • 打赏
  • 举报
回复
有没有更详细的呀
叶子 2012-12-06
  • 打赏
  • 举报
回复
这是用group by 加聚合函数实现的静态行转列 。
你的选择B 2012-12-06
  • 打赏
  • 举报
回复

--SQL的行转换为列
case course when '语文' then score else 0 end  --(取语文行为一列)
max(case course when '语文' then score else 0 end) 语文  --(分组之后,获得语文这列的最大值(过滤无效的0数据))
cast(avg(score*1.0) as decimal(18,2)) 平均分  --(分组之后,获得每一组的平均值)
sum(score) 总分  --(分组之后,获得每一组的总和值)
zhengnan2012 2012-12-06
  • 打赏
  • 举报
回复
主要就是这个吧 max是一个聚合函数,配合group by 使用 max(case course when '语文' then score else 0 end) 语文, 再看里面case when case course when '语文' then score else 0 end 这个就是当course为‘语文’时取成绩,否则就不取。这里用max取出来的一家就是语文成绩,因为成绩一般大于0,你也可以用sum()来代替。

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧