08-聚合函数:高效进行分组统计

08-聚合函数:高效进行分组统计

MySQL中的五种常用函数SUM()AVG()MAX()MIN()COUNT()

超市经营者提出,他们需要统计某个门店,每天、每个单品的销售情况,包括销售数量和销售金额等。

三个数据表

销售明细表(demo.transactiondetails)

image-20230221135311992

销售单头(demo.transactionhead)

image-20230302151635149

商品信息表(demo.goodsmaster)

image-20230302151656986

SUM()

SUM()函数返回指定字段值的和

查询用户某个门店,每天,每种商品的销售总计数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
select 
left(b.transdate,10),
c.goodsname,
sum(a.quantity),
sum(a.salesvalue)
from
demo.transactiondetails a
join
demo.transactionhead b on (a.transactionid = b.transactionid)
join
demo.goodsmaster c on (a.itemnumber= c.itemnumber)
group by left(b.transdate,10),c.goodsname
order by left(b.transdate,10),c.goodsname;

引入关键字leftORDER BY

LEFT(str,n)

返回字符串str最左边的n个字符left(a.transdate,10),表示返回交易时间字符串最左边的10个字符。在MySQL中,DATETIME的格式为:YYYYY-MM-DD,一共是10个字符。

ORDER BY

按照指定字段排序

步骤:

第一步:完成三个表的连接

image-20230302152449705

第二步:对结果集按照交易时间和商品名称进行分组,我们可以分成下面 4 组

第一组:

image-20230302152525599

第二组:

image-20230302152726725

第三组:

image-20230302152755137

第四组:

image-20230302152811191

第三步:对各组的销售数量和销售金额进行统计,并且按照交易日期和商品名称排序。

image-20230219102927119

如果用户要知道全部商品销售的总计数量和总计金额,我们可以把数据集的整体看做一张表,进行计算。

这样就不需要从关联表中获取数据,也不需要连接。

1
2
3
4
5
select 
sum(quantity),
sum(salesvalue)
from
demo.transactiondetails;

image-20230309140757400

AVG()、MAX()、MIN()

1.AVG()

1
2
3
4
5
6
7
8
9
10
11
12
13
select 
left(a.transdate,10),
c.goodsname,
avg(b.quantity),
avg(b.salesvalue)
from
demo.transactionhead a
join
demo.transactiondetails b on (a.transactionid = b.transactionid)
join
demo.goodsmaster c on(b.itemnumber = c.itemnumber)
group by left(a.transdate,10),c.goodsname
order by left(a.transdate,10),c.goodsname;

image-20230219105728594

2.MAX()、MIN()

1
2
3
4
5
6
7
8
9
10
11
12
select 
left(a.transdate,10),
MAX(b.quantity),
MAX(b.salesvalue)
from
demo.transactionhead a
join
demo.transactiondetails b on(a.transactionid = b.transactionid)
join
demo.goodsmaster c on (b.itemnumber = c.itemnumber)
group by left(a.transdate,10)
order by left(a.transdate,10);

image-20230219110136113

注意:MAX(b.quantity)和MAX(b.salesvalue)算出的结果不一定是同一条记录的数据。

实际上,MySQL是分开计算的。

查询中用了3个相互关联的表:销售流水明细表、销售流水单头表、商品信息表,三张表连接完成后,MySQL进行了分组。

第一组:image-20230309141610407

第二组:

image-20230309141650891

第一组,最大数量在第2条记录中,是5,最大金额在第一条记录中,是178。

第二主中,最大数量出现在第4条记录,是10,最大金额则出现在第1条记录中,是267。

所以,MAX(字段)这个函数返回分组集中最大的那个值。如果查询MAX(字段1)和MAX(字段2),他们是相互独立、分别计算的,千万不要认为结果在同一条记录上!!!!!

COUNT()

通过COUNT()了解数据集的大小,对于系统优化十分重要。

用户数量增多,系统会出现卡顿问题。

引入分页策略。

分页策略

不将查询结果一次性全部返回客户端,而是根据屏幕大小,计算可以显示的记录数,每次返回用户电脑屏幕可以显示的数据集。

COUNT函数的两种情况:

  • COUNT(*):统计一共有多少条记录
  • COUNT(字段):统计有多少个不为空的字段值

1.COUNT(*)

1
2
select * 
from demo.transactiondetails

image-20230309150331158

1
2
select count(*)
from demo.transactiondetails;

image-20230309150518069

一页可以显示30个数据,一共6个数据,所以就只有1页。

如果超市经营者想知道每天每种商品有几次销售,就需要按天、按商品名称,进行分组查询:

1
2
3
4
5
6
7
8
9
10
select 
left (a.transdate,10),c.goodsname,count(*)
from
demo.transactionhead a
join
demo.transactiondetails b on(a.transactionid = b.transactionid)
join
demo.goodsmaster c on (b.itemnumber = c.itemnumber)
group by left(a.transdate,10),c.goodsname
order by left(a.transdate,10),c.goodsname;

image-20230219115456110

2.COUNT(字段)

COUNT(字段)用来统计分组这个字段的值出现了几次,如果字段是空,就不统计。

1
2
select *
from demo.goodsmaster

image-20230313224901874

1
2
select count(goodsname)
from demo.goodsmaster;

image-20230313225002459

统计字段“specification”,用COUNT(specification),结果为1,空值不统计

1
2
select COUNT(specification)
from demo.goodsmaster;

image-20230313225317370


08-聚合函数:高效进行分组统计
http://example.com/2023/02/19/08-聚合函数-高效进行分组统计/
Author
WYX
Posted on
February 19, 2023
Licensed under