SQL 订单揽收统计

时间:2022-07-23
本文章向大家介绍SQL 订单揽收统计,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题描述

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

t 表结构:

字段

类型

描述

track_no

String

运单号

customer_id

String

客户ID

created_date

Date

创建日期

要求:

统计 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

封面图片由Paolo Chieselli在Pixabay上发布。