案例背景:按周统计周中每天销售额。
要求结果如下图所示:
【1】子查询
SELECT week_year, ( SELECT SUM(net_price) FROM goods_sale WHERE day_week = 2 AND week_year = gs.week_year AND year_num = 2016 ) AS 'Monday', ( SELECT SUM(net_price) FROM goods_sale WHERE day_week = 3 AND week_year = gs.week_year AND year_num = 2016 ) AS 'Tuesday', ( SELECT SUM(net_price) FROM goods_sale WHERE day_week = 4 AND week_year = gs.week_year AND year_num = 2016 ) AS 'Wednesday', ( SELECT SUM(net_price) FROM goods_sale WHERE day_week = 5 AND week_year = gs.week_year AND year_num = 2016 ) AS 'Thursday', ( SELECT SUM(net_price) FROM goods_sale WHERE day_week = 6 AND week_year = gs.week_year AND year_num = 2016 ) AS 'Friday', ( SELECT SUM(net_price) FROM goods_sale WHERE day_week = 7 AND week_year = gs.week_year AND year_num = 2016 ) AS 'Saturday', ( SELECT SUM(net_price) FROM goods_sale WHERE day_week = 1 AND week_year = gs.week_year AND year_num = 2016 ) AS 'Sunday' FROM goods_sale gs WHERE 1 = 1 AND year_num = 2016 GROUP BY gs.week_year;
抛开表分区不谈,这种方式效率很低。结果如下图所示,耗时167.180S:
【2】IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL)
,则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
实例如下:
SELECT gs.week_year, sum(if(gs.day_week=1,gs.net_price,0)) AS 'Sunday', sum(if(gs.day_week=2,gs.net_price,0)) AS 'Monday', sum(if(gs.day_week=3,gs.net_price,0)) AS 'Tuesday', sum(if(gs.day_week=4,gs.net_price,0)) AS 'Wednesday', sum(if(gs.day_week=5,gs.net_price,0)) AS 'Thursday', sum(if(gs.day_week=6,gs.net_price,0)) AS 'Friday', sum(if(gs.day_week=7,gs.net_price,0)) AS 'Saturday', sum(gs.net_price) FROM goods_sale gs WHERE 1 = 1 AND gs.year_num = 2016 GROUP BY gs.week_year
效率显然比第一种方式(子查询)要高,结果如下(耗时0.119S):
【3】CASE…WEHN…THEN…ELSE…END
实例如下 :
SELECT week_year, SUM( ( CASE gs.day_week WHEN 1 THEN gs.net_price ELSE 0 END ) ) Sunday, SUM( ( CASE gs.day_week WHEN 2 THEN gs.net_price ELSE 0 END ) ) Monday, SUM( ( CASE gs.day_week WHEN 3 THEN gs.net_price ELSE 0 END ) ) Tuesday, SUM( ( CASE gs.day_week WHEN 4 THEN gs.net_price ELSE 0 END ) ) Wednesday, SUM( ( CASE gs.day_week WHEN 5 THEN gs.net_price ELSE 0 END ) ) Thursday, SUM( ( CASE gs.day_week WHEN 6 THEN gs.net_price ELSE 0 END ) ) Friday, SUM( ( CASE gs.day_week WHEN 7 THEN gs.net_price ELSE 0 END ) ) Saturday, SUM(gs.net_price) FROM goods_sale gs WHERE year_num = 2016 GROUP BY week_year
效率比子查询显然快。结果如下,耗时0.101S:
综上,MySQL行转列时,要综合考虑运用函数提高效率!