2.20 sql基础聚合函数(COUNT、SUM、AVG、MAX、MIN)
2.20 基础聚合函数COUNT、SUM、AVG、MAX、MIN在电商数据分析中你几乎每天都要用到聚合函数统计总订单数COUNT。计算总销售额SUM。求平均客单价AVG。找最高/最低金额MAX/MIN。这一章我会带你彻底搞懂五个最常用的聚合函数COUNT、SUM、AVG、MAX、MIN。学完之后你能独立完成电商核心经营指标的一站式统计。学习前准备已完成MySQL安装参考系列前几章已安装DBeaver或Navicat准备一个练习数据库比如agg_demo学习前环境准备步骤1确保MySQL服务已启动。步骤2创建练习数据库和表并插入示例数据。CREATEDATABASEagg_demoCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;USEagg_demo;-- 订单表CREATETABLEorders(order_idINTPRIMARYKEYAUTO_INCREMENT,user_idINTNOTNULL,shop_nameVARCHAR(50)NOTNULL,product_nameVARCHAR(100),amountDECIMAL(10,2)NOTNULL,quantityINTNOTNULLDEFAULT1,order_statusVARCHAR(20)NOTNULL,create_timeDATETIMENOTNULL);INSERTINTOorders(user_id,shop_name,product_name,amount,quantity,order_status,create_time)VALUES(1001,女装旗舰店,碎花连衣裙,299.00,2,已支付,2025-06-01 10:00:00),(1002,女装旗舰店,纯棉T恤,189.00,3,已取消,2025-06-01 11:00:00),(1003,男装专营店,牛仔裤,599.00,1,已支付,2025-06-02 09:30:00),(1001,女装旗舰店,雪纺衫,399.00,1,已支付,2025-06-03 14:20:00),(1004,童装店,儿童T恤,99.00,5,已完成,2025-06-03 16:00:00),(1005,女装旗舰店,真丝连衣裙,1299.00,1,已支付,2025-06-04 08:30:00),(1002,男装专营店,休闲短裤,89.00,2,已取消,2025-06-04 10:00:00),(1006,女装旗舰店,基础打底衫,89.00,10,已支付,2025-06-05 09:00:00),(1007,男装专营店,Polo衫,259.00,1,已支付,2025-06-05 14:00:00);聚合函数基础认知聚合函数对一组值执行计算返回单个结果。它们通常与GROUP BY配合使用也可以单独用于全表统计。常用聚合函数函数作用电商示例COUNT()计数订单数、用户数SUM()求和GMV、销量AVG()平均值客单价、件单价MAX()最大值最高订单金额MIN()最小值最低商品售价执行逻辑聚合函数会在WHERE筛选之后、GROUP BY分组之后对每组进行计算。我的踩坑经历第一次用COUNT(*)时我以为COUNT(column)和COUNT(*)一样后来发现COUNT(column)会忽略NULL值导致计数偏少。从此我根据需求选择正确的形式。COUNT函数详解计数4.1 基础语法COUNT(*)-- 统计所有行包括NULLCOUNT(列名)-- 统计该列非NULL的行数COUNT(DISTINCT列名)-- 统计去重后的数量4.2 电商实操案例案例一统计总订单数SELECTCOUNT(*)AStotal_ordersFROMorders;预期结果9。案例二统计已支付订单数SELECTCOUNT(*)ASpaid_ordersFROMordersWHEREorder_status已支付;预期结果6ORD001、ORD003、ORD004、ORD006、ORD008、ORD009。案例三统计有商品名称的订单数排除NULL假设没有NULL演示用法。SELECTCOUNT(product_name)AShas_product_nameFROMorders;案例四统计独立用户数去重SELECTCOUNT(DISTINCTuser_id)ASunique_usersFROMorders;预期结果71001,1002,1003,1004,1005,1006,1007。4.3 分步操作确定要统计的对象所有行、某列非空、去重。加上WHERE条件如果需要。执行并验证。避坑提醒COUNT(*)和COUNT(1)性能几乎相同推荐用COUNT(*)。COUNT(column)会忽略NULL如果不确定是否有NULL用COUNT(*)更安全。实操避坑提醒统计用户数时必须用COUNT(DISTINCT user_id)否则同一用户多单会被重复计数。SUM函数详解求和5.1 基础语法SUM(列名)-- 对数值列求和自动忽略NULL5.2 电商实操案例案例一计算全店GMV已支付订单总金额SELECTSUM(amount)ASgmvFROMordersWHEREorder_status已支付;预期结果299599399129989259 2944? 计算2995998983991297129925968926852592944。正确。案例二计算女装旗舰店的总销量数量SELECTSUM(quantity)AStotal_quantityFROMordersWHEREshop_name女装旗舰店;预期结果231110 17? 注意ORD002是已取消但数量也计入通常只计有效订单需要加order_status条件。SELECTSUM(quantity)AStotal_quantityFROMordersWHEREshop_name女装旗舰店ANDorder_status已支付;预期结果ORD001(2), ORD004(1), ORD006(1), ORD008(10) 14。案例三计算退款总金额假设退款订单状态为“已取消”SELECTSUM(amount)ASrefund_amountFROMordersWHEREorder_status已取消;预期结果18989278。5.3 分步操作筛选有效订单WHERE。对需要求和的列使用SUM。执行验证。避坑提醒SUM自动忽略NULL但不会忽略字符串。确保列是数值类型。对金额列求和时注意单位一致如都是元。我的踩坑经历我写过SUM(amount)结果amount列里混了一个文本“N/A”导致整个求和结果为NULL。从那以后我每次都会先检查数据类型。AVG函数详解平均值6.1 基础语法AVG(列名)-- 对数值列求平均值自动忽略NULL6.2 电商实操案例案例一计算全店平均客单价已支付订单的平均金额SELECTAVG(amount)ASavg_order_valueFROMordersWHEREorder_status已支付;预期结果2944 / 6 ≈ 490.67。案例二计算女装旗舰店已支付订单的平均件单价金额/数量这里简化平均每笔订单金额SELECTAVG(amount)FROMordersWHEREshop_name女装旗舰店ANDorder_status已支付;预期结果(299399129989)/4 2086/4521.5。案例三计算每个用户平均下单金额需配合GROUP BY但这里先演示整体SELECTAVG(amount)FROMordersWHEREorder_status已支付;6.3 分步操作筛选数据。用AVG计算。执行验证。避坑提醒AVG只对数值列有效。AVG会忽略NULL但不会忽略0。0会拉低平均值要根据业务决定是否排除。实操避坑提醒客单价 GMV / 订单数不等于AVG(amount)吗是的因为AVG(amount)就是总金额除以订单数。但如果订单有多个商品amount已经是订单总金额那么AVG(amount)就是客单价。MAX/MIN函数详解最大/最小值7.1 基础语法MAX(列名)-- 最大值MIN(列名)-- 最小值7.2 电商实操案例案例一找出最高订单金额SELECTMAX(amount)ASmax_amountFROMorders;预期结果1299。案例二找出最低订单金额已支付订单SELECTMIN(amount)ASmin_amountFROMordersWHEREorder_status已支付;预期结果89ORD008。案例三找出最早和最晚的下单时间SELECTMIN(create_time)ASfirst_order,MAX(create_time)ASlast_orderFROMorders;预期结果2025-06-01 10:00:00 和 2025-06-05 14:00:00。案例四在商品表中找出最高和最低价格假设有商品表-- 创建商品表CREATETABLEproducts(product_idINTPRIMARYKEY,product_nameVARCHAR(100),priceDECIMAL(10,2));INSERTINTOproductsVALUES(1,连衣裙,299),(2,T恤,89),(3,牛仔裤,199);SELECTMAX(price),MIN(price)FROMproducts;7.3 分步操作筛选条件可选。用MAX或MIN。执行验证。避坑提醒MAX/MIN对文本列按字典序比较。对日期列也能正确比较。我的踩坑经历我用MAX(product_name)找最晚的商品名称结果返回了字典序最大的不是按时间。排序和聚合要分清。多个聚合函数的组合用法8.1 基础语法可以在一个SELECT中同时使用多个聚合函数得到一站式统计。SELECTCOUNT(*)AStotal_orders,SUM(amount)ASgmv,AVG(amount)ASavg_price,MAX(amount)ASmax_price,MIN(amount)ASmin_priceFROMordersWHEREorder_status已支付;8.2 电商实操案例案例一全店经营核心指标已支付订单SELECTCOUNT(*)ASorder_cnt,SUM(amount)ASgmv,ROUND(AVG(amount),2)ASavg_order_value,MAX(amount)ASmax_order,MIN(amount)ASmin_orderFROMordersWHEREorder_status已支付;预期结果order_cnt6, gmv2944, avg_order_value490.67, max1299, min89。案例二女装旗舰店的销售汇总SELECTCOUNT(*)ASorders,SUM(amount)ASgmv,SUM(quantity)ASitems_sold,AVG(amount)ASavg_price,MAX(amount)AShighest,MIN(amount)ASlowestFROMordersWHEREshop_name女装旗舰店ANDorder_status已支付;预期结果orders4, gmv2086, items_sold14, avg_price521.5, highest1299, lowest89。案例三按店铺分组统计预告下一章内容这里简单展示SELECTshop_name,COUNT(*)ASorder_cnt,SUM(amount)ASgmvFROMordersWHEREorder_status已支付GROUPBYshop_name;8.3 分步操作确定要统计的指标。写出所有聚合函数给别名。添加WHERE条件可选。执行并验证。避坑提醒聚合函数不能与普通列混用除非有GROUP BY。例如SELECT order_id, COUNT(*) FROM orders会报错。多个聚合函数互相独立计算顺序不影响结果。实操避坑提醒在计算平均值前如果要去除异常值可以在WHERE中先过滤。例如WHERE amount BETWEEN 10 AND 10000。综合实操案例服饰类目店铺月度经营核心指标统计9.1 案例背景某服饰类目店铺需要生成一份6月份的经营汇总报表包含以下指标总订单数所有状态。有效订单数已支付已完成。GMV已支付已完成的金额总和。客单价GMV / 有效订单数。最高订单金额、最低订单金额。总销量数量总和有效订单。独立用户数去重。9.2 分步操作步骤1总订单数SELECTCOUNT(*)AStotal_ordersFROMordersWHEREcreate_timeBETWEEN2025-06-01AND2025-06-30;步骤2有效订单数SELECTCOUNT(*)ASvalid_ordersFROMordersWHEREorder_statusIN(已支付,已完成)ANDcreate_timeBETWEEN2025-06-01AND2025-06-30;步骤3GMVSELECTSUM(amount)ASgmvFROMordersWHEREorder_statusIN(已支付,已完成)ANDcreate_timeBETWEEN2025-06-01AND2025-06-30;步骤4客单价SELECTROUND(SUM(amount)/COUNT(*),2)ASavg_order_valueFROMordersWHEREorder_statusIN(已支付,已完成)ANDcreate_timeBETWEEN2025-06-01AND2025-06-30;步骤5最高/最低订单金额有效订单SELECTMAX(amount)ASmax_amount,MIN(amount)ASmin_amountFROMordersWHEREorder_statusIN(已支付,已完成)ANDcreate_timeBETWEEN2025-06-01AND2025-06-30;步骤6总销量有效订单的数量总和SELECTSUM(quantity)AStotal_itemsFROMordersWHEREorder_statusIN(已支付,已完成)ANDcreate_timeBETWEEN2025-06-01AND2025-06-30;步骤7独立用户数有效订单SELECTCOUNT(DISTINCTuser_id)ASunique_usersFROMordersWHEREorder_statusIN(已支付,已完成)ANDcreate_timeBETWEEN2025-06-01AND2025-06-30;步骤8一站式查询组合SELECTCOUNT(*)AStotal_orders,SUM(CASEWHENorder_statusIN(已支付,已完成)THEN1ELSE0END)ASvalid_orders,SUM(CASEWHENorder_statusIN(已支付,已完成)THENamountELSE0END)ASgmv,ROUND(SUM(CASEWHENorder_statusIN(已支付,已完成)THENamountELSE0END)/NULLIF(SUM(CASEWHENorder_statusIN(已支付,已完成)THEN1ELSE0END),0),2)ASavg_order_value,MAX(CASEWHENorder_statusIN(已支付,已完成)THENamountELSENULLEND)ASmax_amount,MIN(CASEWHENorder_statusIN(已支付,已完成)THENamountELSENULLEND)ASmin_amount,SUM(CASEWHENorder_statusIN(已支付,已完成)THENquantityELSE0END)AStotal_items,COUNT(DISTINCTCASEWHENorder_statusIN(已支付,已完成)THENuser_idEND)ASunique_usersFROMordersWHEREcreate_timeBETWEEN2025-06-01AND2025-06-30;9.3 结果验证执行一站式查询检查数据逻辑如客单价 GMV / 有效订单数。 电商数据合规提示在统计独立用户数时使用内部匿名user_id不要涉及手机号等敏感信息。汇总指标如GMV、客单价属于经营数据内部共享时注意权限控制。本章踩坑清单与合规总结10.1 新手常见踩坑错误原因正确做法COUNT(column)忽略NULL导致计数偏少不理解NULL处理用COUNT(*)或确保列非空金额列包含非数字字符求和结果为0或NULL先清洗数据转换类型AVG包含0值0拉低平均值根据业务决定是否排除0聚合函数与普通列混用无GROUP BY语法错误要么全聚合要么加GROUP BYSUM(amount)未过滤无效订单统计了退款订单加WHERE order_status 已支付10.2 性能优化建议为WHERE条件中的列如create_time、order_status建立索引。避免在聚合函数中使用DISTINCT处理大数据量可先用子查询去重。10.3 电商数据合规红线统计指标不要包含个人标识如统计用户数时只输出数字不输出用户ID列表。GMV等核心指标内部报表需加密传输避免泄露。退款金额统计注意区分“退款”和“取消”业务定义要清晰。结语聚合函数是SQL统计分析的基石。掌握COUNT、SUM、AVG、MAX、MIN你就能独立计算电商核心经营指标。有问题的评论区留言我看到会回复。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2524535.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!