You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写嵌套聚合SQL统计下单次数相同的客户数量

统计下单次数相同的客户数量SQL实现

基于你提供的示例表tbl,以下分别实现两种预期结果的SQL语句:


形式二:结构化统计结果

先统计每个客户的下单次数,再按下单次数分组统计对应客户数量:

WITH tbl AS (
    SELECT 'UK'  "CUST_GRP", '00001' "CUST_ID", 'John'  "CUST_NAME", '001' "ORDER_ID", 'Beer' "GOODS" FROM DUAL UNION ALL
    SELECT 'ITA' "CUST_GRP", '00002' "CUST_ID", 'Jack'  "CUST_NAME", '002' "ORDER_ID", 'Coca Cola' "GOODS" FROM DUAL UNION ALL
    SELECT 'ITA' "CUST_GRP", '00002' "CUST_ID", 'Jack'  "CUST_NAME", '003' "ORDER_ID", 'Fanta' "GOODS" FROM DUAL UNION ALL
    SELECT 'ITA' "CUST_GRP", '00003' "CUST_ID", 'Lisa'  "CUST_NAME", '004' "ORDER_ID", 'Beer' "GOODS" FROM DUAL UNION ALL
    SELECT 'ITA' "CUST_GRP", '00003' "CUST_ID", 'Lisa'  "CUST_NAME", '005' "ORDER_ID", 'Coffee' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00004' "CUST_ID", 'Messi' "CUST_NAME", '006' "ORDER_ID", 'Wine' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00004' "CUST_ID", 'Messi' "CUST_NAME", '007' "ORDER_ID", 'Juice' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00004' "CUST_ID", 'Messi' "CUST_NAME", '008' "ORDER_ID", 'Beer' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00005' "CUST_ID", 'Mary'  "CUST_NAME", '009' "ORDER_ID", 'Wine' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00005' "CUST_ID", 'Mary'  "CUST_NAME", '020' "ORDER_ID", 'Else' "GOODS" FROM DUAL 
),
customer_order_count AS (
    -- 统计每个客户的下单次数
    SELECT CUST_ID, COUNT(DISTINCT ORDER_ID) AS order_times
    FROM tbl
    GROUP BY CUST_ID
)
-- 按下单次数分组统计客户数量
SELECT order_times AS "下单次数", COUNT(CUST_ID) AS "客户数量"
FROM customer_order_count
GROUP BY order_times
ORDER BY order_times;

执行结果:

下单次数客户数量
11
23
31

形式一:文本化统计结果

基于形式二的统计逻辑,将结果拼接为指定格式的文本:

WITH tbl AS (
    SELECT 'UK'  "CUST_GRP", '00001' "CUST_ID", 'John'  "CUST_NAME", '001' "ORDER_ID", 'Beer' "GOODS" FROM DUAL UNION ALL
    SELECT 'ITA' "CUST_GRP", '00002' "CUST_ID", 'Jack'  "CUST_NAME", '002' "ORDER_ID", 'Coca Cola' "GOODS" FROM DUAL UNION ALL
    SELECT 'ITA' "CUST_GRP", '00002' "CUST_ID", 'Jack'  "CUST_NAME", '003' "ORDER_ID", 'Fanta' "GOODS" FROM DUAL UNION ALL
    SELECT 'ITA' "CUST_GRP", '00003' "CUST_ID", 'Lisa'  "CUST_NAME", '004' "ORDER_ID", 'Beer' "GOODS" FROM DUAL UNION ALL
    SELECT 'ITA' "CUST_GRP", '00003' "CUST_ID", 'Lisa'  "CUST_NAME", '005' "ORDER_ID", 'Coffee' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00004' "CUST_ID", 'Messi' "CUST_NAME", '006' "ORDER_ID", 'Wine' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00004' "CUST_ID", 'Messi' "CUST_NAME", '007' "ORDER_ID", 'Juice' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00004' "CUST_ID", 'Messi' "CUST_NAME", '008' "ORDER_ID", 'Beer' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00005' "CUST_ID", 'Mary'  "CUST_NAME", '009' "ORDER_ID", 'Wine' "GOODS" FROM DUAL UNION ALL
    SELECT 'FRA' "CUST_GRP", '00005' "CUST_ID", 'Mary'  "CUST_NAME", '020' "ORDER_ID", 'Else' "GOODS" FROM DUAL 
),
customer_order_count AS (
    SELECT CUST_ID, COUNT(DISTINCT ORDER_ID) AS order_times
    FROM tbl
    GROUP BY CUST_ID
),
order_customer_count AS (
    SELECT order_times, COUNT(CUST_ID) AS customer_count
    FROM customer_order_count
    GROUP BY order_times
)
SELECT CONCAT('下单', order_times, '次的客户数量为', customer_count) AS "TEXT"
FROM order_customer_count
ORDER BY order_times;

执行结果:

TEXT
下单1次的客户数量为1
下单2次的客户数量为3
下单3次的客户数量为1

内容的提问来源于stack exchange,提问作者AAALLLL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:10:36