sql分组求平均值_SQL-汇总分析

本文介绍了SQL的汇总分析,包括COUNT、SUM、AVG、MAX、MIN等函数的使用,以及如何进行数据分组、对分组结果指定条件(HAVING子句)。详细讲解了如何用SQL解决业务问题,如计算各科平均成绩、分组查询成绩范围、性别统计等。此外,还讨论了对查询结果排序的方法(ORDER BY)及常见的SQL错误。提供了多个练习题帮助读者巩固学习。

大纲

1.汇总分析

2.分组

3.对分组结果指定条件

4.用sql解决业务问题

5.对查询结果排序

6.如何看懂报表信息

一,汇总分析

  • 汇总函数

汇总函数 作用

count 求某列的行数

sum 对某列数据求和

avg 求某列数据的平均值

max 求某列数据的最大值

min 求某列数据的最小值

  • 函数的三个功能

功能 输入 输出

count函数

1.count(选择列名)

会自动排除null

c974cb95135ed2b555fc8d7240181c6b.png

count(全部列)不会排除null

6902281409a424132f84d81d77c1a3ca.png

2.求和(sum)

114ebf663ec55e797c9a60474e999265.png

3.求某列数据平均值

bcde8e65ceacd56da4564824e818a247.png

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

13e6108391a304608641a6c53e714b1f.png

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

d2acf78d3f1e1861ec278786130def8f.png

二,分组

sql分组:group by

分组方法

1.数据分组

2.应用函数

3.组合结果

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

7f2dcb8bccb91475ed3234117d45ddf0.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是识别不出的。

7ed88792e8f935cb14d17f2a63251471.png

2.在where中使用聚合函数

4031f8c5eab559b7e1d5f7cdaa3b2266.png

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

9f238c788ceb6b64bb1daedc93a25224.png

练习:

一,汇总分析

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

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

247b165d74f8d897fd9ff9704fa873fa.png

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

select count(学号)
from score;

c96f4c246425b92f281a31a2aef87831.png

二,分组

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

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

84d2372c662dfc10cb869db82aa89686.png

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

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

ac8a7e12c71128487e08a09483eba1a0.png

3.查询男生,女生人数

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

ec64813a24afafe6588e6e3526975bac.png

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

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

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

c525c144c16a1a669d3fbd650df9caec.png

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

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

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

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

4003a5e36bb3273265c8288b5b615953.png

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

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

step2:统计同名的人数

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

028a2aec56506f848af5d33a4ab5af6e.png

四,用sql解决业务问题

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

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

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

03189497969907f416e0fd765bdfee8b.png

五,对查询结果进行排序

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

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

beef7c1097212464181535ee28aae7e5.png

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

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

690c7f0e537789f6be6dc4abcd4fa61e.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;
<think>我们被要解读创建生产工单视图的SQL代码,包括字段含义和查询逻辑。由于用户没有提供具体的SQL代码,我们需要根据常见的生产工单视图结构进行解读,并参考引用中的一些SQL规范和实践。根据引用[1],我们应该注意SQL代码的规范,比如表名大小写一致性,避免重复解析。引用[3]提到了视图合并数据的几种连接方式(内连接、左连接、右连接、全连接)。引用[4]提供了创建表、索引以及视图的示例。引用[5]给出了一个创建学生平均成绩视图的例子。生产工单视图通常用于展示生产工单的关键信息,可能涉及多个表的连接,比如工单主表、产品表、工序表、状态表等。视图的创建逻辑可能包括选择必要的字段、定义计算字段、连接多个表以及设置过滤条件等。下面是一个典型的生产工单视图的SQL代码示例,我们将对其进行解读:```sqlCREATEVIEWv_production_orderASSELECTo.order_idAS工单编号,o.product_codeAS产品编码,p.product_nameAS产品名称,o.quantityAS生产数量,o.start_dateAS开始日期,o.end_dateAS结束日期,s.status_nameAS工单状态,o.priorityAS优先级,(SELECTSUM(actual_quantity)FROMproduction_logWHEREorder_id=o.order_id)AS已生产数量FROMt_production_orderoLEFTJOINt_productpONo.product_code=p.product_codeLEFTJOINt_order_statussONo.status_id=s.status_idWHEREo.is_active=1;```###字段含义解读:1.**工单编号**:生产工单的唯一标识,来源于`t_production_order`表的`order_id`字段。2.**产品编码**:产品的编码,来源于`t_production_order`表的`product_code`字段。3.**产品名称**:产品的名称,来源于`t_product`表的`product_name`字段。4.**生产数量**:计划生产的数量,来源于`t_production_order`表的`quantity`字段。5.**开始日期**:工单的计划开始日期。6.**结束日期**:工单的计划结束日期。7.**工单状态**:工单的当前状态(如新建、进行中、已完成等),来源于`t_order_status`表的`status_name`字段。8.**优先级**:工单的优先级(如高、中、低)。9.**已生产数量**:通过子查询从`production_log`表中汇总的实际生产数量。###查询逻辑解读:1.**视图名称**:`v_production_order`,符合引用[4]中虚拟表加前缀`v_`的命名规范。2.**主表**:`t_production_order`(别名为`o`),存储工单的基本信息。3.**左连接**:-与`t_product`表(别名为`p`)连接,通过`product_code`获取产品名称。使用左连接是为了确保即使产品编码在`t_product`表中没有匹配,工单记录仍然可以显示(产品名称显示为NULL)。-与`t_order_status`表(别名为`s`)连接,通过`status_id`获取状态名称。同样使用左连接,以确保即使状态ID在状态表中不存在,工单记录也不会丢失。4.**子查询**:计算每个工单的已生产数量,通过关联子查询(子查询中的`order_id`与主查询的工单编号关联)从`production_log`表中汇总实际生产数量。5.**过滤条件**:只显示活跃工单(`o.is_active=1`)。###注意事项:-视图使用了多个左连接,确保主表记录不因关联表缺失而丢失。-子查询用于计算聚合值(已生产数量),这可能会影响性能。如果数据量大,可以考虑在工单表中增加冗余字段或使用其他优化方式(引用[4]提到索引的使用原则,这里可以在`production_log`表的`order_id`上创建索引)。-字段别名使用中文,增强了可读性,但实际项目中可能根据需使用英文。###性能优化建议:根据引用[1]和引用[4]:-确保关联字段(如`product_code`,`status_id`,`order_id`)上有索引,以提高连接和子查询的效率。-避免在视图中使用复杂的子查询,特别是当数据量很大时。可以考虑使用物化视图或者定期更新的汇总表。###相关问题:1.在生产工单视图中,如果产品名称需要根据不同的语言环境显示,应该如何修改视图?2.视图中的子查询对性能有什么影响?如何优化?3.如何确保视图中的左连接不会导致数据重复?以上解读基于一个典型的示例,实际SQL代码可能有所不同,但基本逻辑相似。用户可以根据实际代码调整解读。</think>### 解读生产工单视图的SQL代码 以下基于典型生产工单视图的通用设计逻辑和引用资料进行解读,需结合实际SQL调整: --- #### **1. 核心字段含义**(假设视图名为 `v_production_order`) ```sql CREATE VIEW v_production_order AS SELECT o.order_id AS 工单ID, -- 工单唯一标识 [^4] o.product_code AS 产品编码, -- 关联产品表 p.product_name AS 产品名称, -- 通过JOIN获取 o.quantity AS 计划数量, -- 工单计划生产量 o.start_date AS 开始日期, o.due_date AS 截止日期, s.status_name AS 工单状态, -- 状态表关联 COALESCE(o.actual_quantity, 0) AS 实际产量, -- 空值处理 [^2] (SELECT AVG(quality_score) FROM quality_check q WHERE q.order_id = o.order_id) AS 平均质检分 -- 子查询计算 [^5] FROM t_production_order o -- 主表 (t_前缀规范 [^4]) LEFT JOIN t_product p ON o.product_code = p.product_code -- 产品信息 LEFT JOIN t_order_status s ON o.status_id = s.status_id -- 状态信息 WHERE o.is_active = 1; -- 过滤有效工单 ``` --- #### **2. 关键查询逻辑解析** | **组件** | **作用说明** | **引用依据** | |------------------|-----------------------------------------------------------------------------|--------------------------| | **`LEFT JOIN`** | 保留主表所有工单,即使关联表无匹配数据(避免丢失工单记录) | 连接类型选择 [^3] | | **`COALESCE()`** | 处理空值:当实际产量为NULL时显示0(确保字段完整性) | 空值判断逻辑 [^2] | | **子查询** | 动态计算每个工单的平均质检分(需注意性能,大表慎用) | 视图计算字段 [^5] | | **`WHERE`过滤** | 只查询活跃工单(`is_active=1`),排除已归档数据 | 数据过滤规范 [^1] | | **别名规范** | 表别名`o/p/s`简化代码,字段别名使用中文增强可读性 | 编码简洁性原则 [^1] | --- #### **3. 视图设计要点** 1. **冗余字段合并** - 如将`产品编码`和`产品名称`合并展示,避免用户二次关联查询 [^3] 2. **跨表状态映射** - 通过`t_order_status`表将状态ID转换为可读文本(如"生产中"/"已完成")[^4] 3. **计算字段封装** - 平均质检分动态计算,隐藏底层复杂查询 [^5] 4. **空值防御** - 使用`COALESCE`确保关键数值字段无NULL [^2] --- #### **4. 性能优化建议** - **索引优化**:在关联字段(`product_code`, `status_id`)和过滤字段(`is_active`)上创建索引 [^4] - **避免复杂子查询**:若质检分计算频繁使用,建议物化到工单主表 [^4] - **分区表**:按`start_date`分区提升大表查询效率 [^1] --- ### 相关问题 1. 如何在生产工单视图中实现多层级状态(如审批中/生产中/质检中)的映射? 2. 如果实际产量需要实时从流水线表汇总,如何优化视图性能? 3. 视图中的`COALESCE`函数能否用其他空值处理方法替代?各有什么优劣? [^1]: SQL代码编码原则和规范 [^2]: SQL查询中空值判断逻辑 [^3]: 多表连接与字段合并策略 [^4]: 数据表设计及索引规范 [^5]: 视图中的动态计算实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值