T-sql GroupBy语句常见问题处理
1.问题描述
现在有一张course表(含课程编号和名称)和一张sc表(含学生学号,选修课程的编号以及考试成绩),如下:
现在想要查询所有课程编号、对应的课程名称以及选修该课程的所有学生的平均成绩。
一开始我的想法就是用以下的查询语句:
select sc.cno as 课程编号, cname as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno
但是显然会报错:
于是开始想其他的办法。
2.第一种方法
首先想到的当然是按照报错信息来了,既然cname不在GROUP BY子句中,那就放到GROUP BY子句中呗,如下:
select sc.cno as 课程编号, cname as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno, cname
但是这种方法是不严谨的,因为这里是知道每个课程号只对应一个课程名称,所以这种办法才行。但是在其他的情况中,一旦每个课程号不是只对应一个课程名称,那就很乱了。所以还得想其他办法。
3.第二种方法
第二个想到的方法也是按照报错信息来,将cname变成聚合函数就行了,如下:
select sc.cno as 课程编号, Max(cname) as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno
-- 或者
select sc.cno as 课程编号, Min(cname) as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno
但是这种方法是比第一种方法还不如的。因为课程名称是字符串,取最大最小值毫无意义。
4.第三种方法
接下来就是正确的方法了,也就是标题提到的扩展SQL语句,也算是嵌套SQL语句。
因为select...from...中,from后面接的是表,所以这个表可以是另一个select语句查询出来的结果,如下:
select course.cno as 课程编号, cname as 课程名称, tmp.平均成绩
from course, (select cno, Avg(grade) as 平均成绩 from sc group by cno) as tmp
where course.cno = tmp.cno
在select...from...中的from后面嵌套一个select...from...,并且将嵌套的select...from...查询出来的表起个别名tmp,这样就能用tmp来操作这张表了。
5.第四种方法
既然select...from...中的from后面可以嵌套一个表,那么select...from...中的select后面可以嵌套一个列吗?
答案是可以的。如下:
select cno as 课程编号,
(select cname from course where sc.cno=course.cno) as 课程名称,
Avg(grade) as 平均成绩
from sc
group by sc.cno
要注意的是在(select cname from course where sc.cno=course.cno)
中必须要有where sc.cno=course.cno
,只有这样查询出来的结果才是一一对应的,否则查询出来的结果是很多的,然后每个cno会对应很多个cname,这样就会乱套,并且这样是会报错的。
T-sql GroupBy语句常见问题处理的更多相关文章
- Linq Mysql GroupBy语句的问题处理
语句如下: var resumeList = db.ChannelResume.Where(model); var groupValues = resumeList.GroupBy(t => n ...
- SQL 查询语句总是先执行 SELECT?你们都错了
很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函数 ...
- [转]MySQL 最基本的SQL语法/语句
MySQL 最基本的SQL语法/语句,使用mysql的朋友可以参考下. DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete ...
- SQL入门语句之ORDER BY 和GROUP BY
一.SQL入门语句之ORDER BY ORDER BY 是用来基于一个或多个列按升序或降序顺序排列数据 1.从数据库表获取全部数据按字段A的升序排列 select *from table_name o ...
- SQL入门语句之LIKE、GLOB和LIMIT
一.SQL入门语句之LIKE LIKE用来匹配通配符指定模式的文本值.如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1.这里有两个通配符与 LIKE 运算符一起使用,百 ...
- SQL入门语句之SELECT和WHERE
一.SQL入门语句之SELECT SELECT语句用于从数据库表中获取数据,结果表的形式返回数据.这些结果表也被称为结果集 1.从数据库表中取部分字段 select 字段A,字段B from tabl ...
- SQL入门语句之INSERT、UPDATE和DELETE
一.SQL入门语句之INSERT insert语句的功能是向数据库的某个表中插入一个新的数据行 1.根据对应的字段插入相对应的值 insert into table_name(字段A, 字段B, 字段 ...
- 快速将一个表的数据生成SQL插入语句
将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...
- sql查询语句如何解析成分页查询?
我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法.sql查询 语句如何解析成“分页查询”和“总统计”两条语句.可能, ...
随机推荐
- 5.Python使用最新爬虫工具requests-html
1.安装,在命令行输入:pip install requests-html,安装成功后,在Pycharm引入即可. 2.代码如下所示: from requests_html import HTMLSe ...
- cassandra的一些概念
分区器Partitioners 在集群内,根据设置的副本数,决定数据如何分发,允许跨机房 具体看 http://teddymaef.github.io/learncassandra/cn/replic ...
- bzoj4764: 弹飞大爷
Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们 决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小 ...
- centos开机提示CPU无法识别的问题
centos版本和对应cpu兼容性,官方网址: https://access.redhat.com/support/policy/intel Red Hat Enterprise Linux Vers ...
- pyc是什么
python是解释型语言,需要解释器对程序逐行做出解释,然后直接运行. C语言是编译型语言,PC不需要翻译,直接执行就可以了. java也是解释型语言,不过速度可以跟编译型媲美. 用java举例,ja ...
- 第十章 hbase默认配置说明
hbase.rootdir:这个目录是region server的共享目录,用来持久化Hbase.URL需要是'完全正确'的,还要包含文件系统的scheme.例如,要表示hdfs中的 '/hbase ...
- kubernetes 学习 pod相关
1 pod的状态: Pending, Running, Succeeded, Failed, Unknown 2 pod重启策略: Always(自动重启,是默认的) . OnFailure(容 ...
- read/write/fsync与fread/fwrite/fflush的关系和区别
read/write/fsync: 1. linux底层操作: 2. 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作. fread/fwrite/fflush: ...
- 关于Eclipse中复制粘贴一个项目后的操作
今天在做一个小Demo,内容和之前的项目有些类似就直接复制过来了,项目名修改了,web.xml的项目名也修改了,可是部署到Tomcat之后,以这个新项目名进行访问就会出现404的错误,只可以使用复制之 ...
- http请求头设置
Curl curl -i -H 'Content-Type: application/json' -i/--include 输出时包括protocol头信息curl -x 10.12.15.1 ...