sql 分组统计_SQL 订单揽收统计

问题描述

有一张揽收表 t,它用来记录发给客户的货物的运单号。

t 表结构:

3c4c94354eab9a9e68e8647f15ffd115.png

要求:

统计 2020 年 7 月份的客户的单量分布情况。

最终展示的效果数据如下:

单量  客户数
------  --------
0-5   10000
6-10  2000
11-20  1200
20以上 800

解决方案

要想统计单量,就得先知道每个客户在 2020 年 7 月份的订单数。

创建日期在这里只是起到了过滤数据的作用,我们先把 2020 年 7 月份的数据捞出来。

SELECT 
  *
FROM
  t 
WHERE created_date BETWEEN '2020-07-01' 
  AND '2020-07-31'

接着在这个基础上统计每个客户的单量,统计的结果存到临时表 tt 中。

SELECT 
  customer_id,
  COUNT(*) AS quantity 
FROM
  t 
WHERE created_date BETWEEN '2020-07-01' 
  AND '2020-07-31' 
GROUP BY customer_id

知道了每个客户的单量,根据单量分组的规则,在统计出来客户的单量的结果里加一个字段标记所在行属于哪个组。标记的操作可通过 case when 做到,最后再依据标记字段分组统计。

SELECT 
  quantity_level AS '单量',
  COUNT(customer_id) AS '客户数' 
FROM
  (SELECT 
    customer_id,
    quantity,
    CASE
      WHEN quantity <= 5 
      THEN '0-5' 
      WHEN quantity <= 10 
      THEN '6-10' 
      WHEN quantity <= 20 
      THEN '11-20' 
      ELSE '20以上' 
    END AS quantity_level 
  FROM
    tt) a 
GROUP BY quantity_level

上面的 SQL 已经能把每个单量所对应的客户给统计出来了,但由于分组的字段是一个字符串类型,结果所展示的顺序并不是我们想要的。

稍微改一下 SQL ,分组的字段用一个数值类型的数字代替,最终展示的时候再把数字翻译成字符串。最终的 SQL 如下:

SELECT 
  CASE
    quantity_level 
    WHEN 1 
    THEN '0-5' 
    WHEN 2 
    THEN '6-10' 
    WHEN 3 
    THEN '11-20' 
    ELSE '20以上' 
  END AS '单量',
  COUNT(customer_id) AS '客户数' 
FROM
  (SELECT 
    customer_id,
    quantity,
    CASE
      WHEN quantity <= 5 
      THEN 1 
      WHEN quantity <= 10 
      THEN 2 
      WHEN quantity <= 20 
      THEN 3 
      ELSE 4 
    END AS quantity_level 
  FROM
    tt) a 
GROUP BY quantity_level 
ORDER BY quantity_level
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值