mysql调优实践(一)

avg(expr),sum(expr)函数的特殊用法

  • 样例表结构
     create table sales_order(
     	`sales_order_no` varchar(20) NOT NULL COMMENT '销售订单编号',
     	`store_code` varchar(255) NOT NULL COMMENT '门店编码',
     	`paid_amount` decimal(10,2) DEFAULT '0.00' COMMENT '已支付金额',
    )AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='销售订单基本信息';
  • 需求
    1、求每个门店销售金额大于300的单数。
    2、求每个门店销售金额大于300的订单占比。
    第一个可能大家比较容易想到在sum函数中使用case when才处理。可是第二个需求我看很多人只会想到子查询的方式或者是两个sum函数相除的方式,比较繁琐。其实有更高效的方式。在avg(expr),sum(expr) 函数中,其中expr表达式如果是条件语句,真会掷1,假为0。 所以有:
select store_code,
count(*) "总单数",
sum(case when so.paid_amount>300 then 1 else 0 end ) as "大于300的订单数",
sum(so.paid_amount>300) as "=》大于300的订单数",
sum(case when so.paid_amount>300 then 1 else 0 end ) / count(*) as "大于300的订单占比",
avg(so.paid_amount>300) as "大于300的订单占比2",
sum(so.paid_amount) as "销售总额"
from sales_order so 
group by store_code order by store_code
  • 分析
    我们看到“大于300的订单数”和“=》大于300的订单数” ,我们看到sum(expr)函数中的表达式是条件判断,同理avg(expr)函数也是条件判断。
    查询结果
    这种方式是不是更巧妙高效了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章