问题描述
有一张揽收表 t,它用来记录发给客户的货物的运单号。
t 表结构:
![3c4c94354eab9a9e68e8647f15ffd115.png](https://i-blog.csdnimg.cn/blog_migrate/02f7737641fe3cc48492fe08ce5e7b3b.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