sql 分组求和_SQL-汇总分析

大纲

1.汇总分析

2.分组

3.对分组结果指定条件

4.用sql解决业务问题

5.对查询结果排序

6.如何看懂报表信息

一,汇总分析

  • 汇总函数

汇总函数 作用

count 求某列的行数

sum 对某列数据求和

avg 求某列数据的平均值

max 求某列数据的最大值

min 求某列数据的最小值

  • 函数的三个功能

功能 输入 输出

count函数

1.count(选择列名)

会自动排除null

ba885dc127075ec1e6d31fb55c3b4876.png

count(全部列)不会排除null

2a989d551716cee3200fec2fe2892a64.png

2.求和(sum)

50565d9d4bf1afb9bcbde8665f7c3e18.png

3.求某列数据平均值

5c63052c16e65f9d9dc36c9f4a874e5d.png

4.求某列数据的最大值,最小值

d4b4f38132f3ec833c208f6dd744f581.png

如果计算之前,不想计算重复值,就可以把重复值删除

410177a5ad663a78dc3be20578917f76.png

二,分组

sql分组:group by

分组方法

1.数据分组

2.应用函数

3.组合结果

2.select 性别,count(*)
3.from student
1.group by 性别;

33233b730944e4016a65d9ed85160e24.png

运行顺序:

1.从哪张表查找数据

2.查询条件

3.对第二步查询出的数据进行分组

4对分组应用函数,并组合结果

三,对分组结果指定条件(having)

select 性别,count(*)
from student
group by 性别
-- 对分组结果指定条件
having count(*)>1;

四,如何用sql解决业务问题

步骤:

1.翻译成大白话

2.写出分析思路

3.写出对应的sql子句

1.翻译大白话

问题:

如何计算各科的平均成绩

=如何计算每门课程平均成绩

2.写出分析思路

select 查询结果[每门课的课程号:分组,平均成绩:avg(成绩)]
from 从哪张表中查找数据[成绩表:score]
where 查询条件[没有]
group by 分组[每门课程:按课程号分组]
having 对分组结果指定条件;[没有]

五,对查询结果排序

对查询结果排序 order by

降序(desc):从大到小

升序(asc):从小到大

limit 从查询结果中取出指定行

六,如何看懂报错信息?

常见错误:

1.在group by 里使用了select的别名

因为group by在select之前运行,所以如果设置别名,group by是识别不出的。

d6fad00efdf0a3dc895fef9a05a288e6.png

2.在where中使用聚合函数

6ed43bac0f8dc1fa7b761be54e9bb090.png

3.字符串和数字的排序是不一样的,在排序之前需要把表格中的数字转换为数值格式

c1060a6179c70040f123477fca6e0bc3.png

练习:

一,汇总分析

1.查询课程编号为“0002”的总成绩

select sum(成绩)
from score
-- 设定指定查询条件
where 课程号="0002";

5fc344210a411a29f0324e6b826e1965.png

2.查询选了课程的学生人数

select count(学号)
from score;

c1c574687507ab2c5da750ee89d796ae.png

二,分组

1.查询各科成绩最高和最低的分

select 课程号,max(成绩),min(成绩)
from score
group by 课程号;

a38145d0b94878194af3bbd6eea417c2.png

2.查询每门课被选修的学生人数

select 课程号,count(学号)
from score
group by 课程号;

a2070185d6a33e2882d14d38ba2144c4.png

3.查询男生,女生人数

select 性别,count(姓名)
from student
group by 性别;

733c7c6eb3e29c8a5447f733380916bb.png

三,对分组结果指定条件(having)

1.查询平均成绩大于60分学生的学号和平均成绩

select 学号,avg(成绩)
from score
group by 学号
having avg(成绩)>60;

1c181979ffd5f02f0e3c186747c0455e.png

2.查询至少选择两门课程的学生学号

step1:计算每个学生选修课程数

step2:统计选择至少两门课程的学生数

select count(课程号),学号
from score
group by 学号
having count(课程号)>=2;

1dd701ca97df94397b40cf6f279d9540.png

3.查询同姓名学生名单并统计同名人数

step1:知道每一个学生姓名(对姓名分组)

step2:统计同名的人数

select 姓名,count(*) as 人数
from student
group by 姓名
having count(*)>=2;

302a39a6cce4146c237dc25d4929af23.png

四,用sql解决业务问题

练习:如何计算每门课程的平均成绩,并且平均成绩大于等于80分

分析思路:
select 查询结果[每门课的课程号:分组,平均成绩:avg(成绩)]
from 从哪张表中查找数据[成绩表:score]
where 查询条件[没有]
group by 分组[每门课程:按课程号分组]
having 对分组结果指定条件;[没有]

sql语句:
select 课程号,avg(成绩)
from score
group by 课程号
having avg(成绩)>=80;

9d3f0102ed6f54ed28fb23e3c99d5889.png

五,对查询结果进行排序

1.查询不及格的课程并按课程号从大到小排列

select count(课程号),成绩
from score
where 成绩<=60
order by 课程号 desc;

5573b271e9b8b6a58101f504a333688f.png

2.查询每门课程的平均成绩,结果按照平均成绩升序排序。平均成绩相同时,按课程号降序排序

select 课程号,avg(成绩) as 平均成绩
from score
group by 课程号
order by 平均成绩 asc,课程号 desc;

25c5550f0738d654f4ece79dfb82c66a.png

SQLZOO习题

错题

select from nobel prize

14.查找1984年获奖者和主题按主题和获胜者名称排序,并把物理奖和化学奖排到最后面显示

select winner,subject
from nobel
where yr=1984
order by subject in ("Physics","Chemistry"),subject,winner;

subject in ("Physics","Chemistry")对subject做一个if的判断,有的是1,没有的是0,

而1在0后面,所以物理和化学奖排到最后面显示

sum and count

7.显示每个大陆的国家数量,并且这些国家里人口数量至少为1000万

分析思路:
#首先确定人口数量至少为1000万的国家,然后每个大陆就意味着按照大陆分组
所以先限定条件,再按大陆分组

select continent,count(name)
from world
where population >=10000000
group by continent

8.列出每个洲名称,并且每个洲人口要大于等于1个亿

分析思路:
#按照州先分组,然后限定每个洲的人口要大于等于1个亿

select continent,count(name)
from world
group by continent
having sum(population)>=100000000;
SQL Server中,可以使用GROUP BY子句对数据进行分组,并使用聚合函数如SUM()对每个组进行求和。下面是一个示例查询,演示如何使用GROUP BY和SUM()函数进行分组求和: SELECT DeptName, SUM(Salary) AS TotalSalary FROM DeptInfo GROUP BY DeptName; 这个查询将根据DeptName列对数据进行分组,并计算每个组的Salary总和。结果将包含每个部门的名称和对应的总薪水。 如果需要在结果中显示全部的合计和小计,可以使用WITH ROLLUP子句。下面是一个示例查询,演示如何使用WITH ROLLUP和CASE语句进行分组求和,并显示合计和小计: SELECT CASE WHEN GROUPING(DeptName) = 1 THEN '合计' ELSE DeptName END AS DeptName, SUM(Salary) AS TotalSalary FROM DeptInfo GROUP BY DeptName WITH ROLLUP; 这个查询将根据DeptName列对数据进行分组,并计算每个组的Salary总和。使用CASE语句在结果中显示'合计'或部门名称。WITH ROLLUP子句将在结果中添加合计行和小计行,以显示每个部门的总薪水和整个表的总薪水。 请注意,以上示例中的表和列名仅供参考,你需要根据实际情况进行调整。 #### 引用[.reference_title] - *1* [Server SQL 分组后 ,其他字段值相加(...for xml path)](https://blog.csdn.net/hamunet/article/details/110355567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计](https://blog.csdn.net/qq_28256783/article/details/98616741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值