锋利的SQL:地域范围内最大数统计

这是在做一个客户管理系统时遇到的问题,公司每年需要按销售区域评选出购买量最大的客户进行单独奖励。区域划分使用地域编码起止区间方式,例如,华东地区的起止编码是1000110003,在100011000210003区域的客户都隶属于华东地区。下面是创建示例的代码,Area表中存放着区域划分范围,Sales存放着每个区域中客户的购买信息。

CREATE TABLE Areas

(area_name char(25) NOT NULL,

 start_codeint NOT NULL,

 end_codeint NOT NULL,

 CHECK(start_code <= end_code));

CREATE TABLE Sales

(sale_id int,

 cust_namechar(15),

 cust_codeint,

 sale_amtdecimal (8,2));

 

INSERT INTO Areas

VALUES ('华东', 10001, 10003),

       ('华南', 10004, 10006),

       ('华北', 10007, 10009);

INSERT INTO Sales

VALUES (1, '张三', 10001, 1000.00),

       (2, '张三', 10002, 1000.00),

       (3, '李四', 10001, 4000.00),

       (4, '王五', 10005, 1000.00),

       (5, '王五', 10006, 2000.00),

       (6, '赵六', 10004, 1500.00);

要统计出每个区域中购买量最大的客户,我们首先想到的是使用GROUP BY子句进行分类汇总,参考下面的语句:

SELECT A.area_name, S.cust_name, SUM(S.sale_amt)AS sale_amt

FROM Areas AS A

  JOIN SalesAS S

    ONS.cust_code BETWEEN A.start_code AND A.end_code

GROUP BY A.area_name, S.cust_name

ORDER BY area_name;      

19-12                                        使用GROUP BY按区域、客户分类汇总结果

area_name

cust_name

sale_amt

华东

李四

4000.00

华东

张三

2000.00

华南

王五

3000.00

华南

赵六

1500.00

从上表可以看出,在华东地区李四的购买量最大,华南地区王五的购买量最大。如果仅统计每地区的最大销售额,不考虑客户名称,完全可以在上表的基础上使用类似下面的语句:

SELECT area_name, MAX(sale_amt)

FROM [19-21]

GROUP BY area_name;

下面的语句将GROUP BY分组统计封装在CTE中,然后将CTE打开两次,取出每区域中购买量最大的客户。查询结果如表19-13所示。

WITH CTE (area_name, cust_name, sale_amt)

AS (SELECT A.area_name, S.cust_name,SUM(S.sale_amt)

    FROMAreas AS A

      JOINSales AS S

        ONS.cust_code BETWEEN A.start_code AND A.end_code

    GROUP BYA.area_name, S.cust_name)

SELECT C1.area_name, C1.cust_name, C1.sale_amt

FROM CTE AS C1

WHERE C1.sale_amt = (SELECT MAX(C2.sale_amt)

                     FROM CTE AS C2

                     WHERE C2.area_name =C1.area_name);

19-13                                                                       查询结果

area_name

cust_name

sale_amt

华南                    

王五          

3000.00

华东                    

李四          

4000.00

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值