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)函數也是條件判斷。
    查詢結果
    這種方式是不是更巧妙高效了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章