其实是一个很简单的应用,只是把思路总结一下。
先导入数据:
创建订单价格表
create table tb_order2
(order_id varchar(255),
price int,
time varchar(255),
area varchar(255));
插入数据
insert into tb_order2(order_id,price,time,area)
values
('S001',10,'2019/1/1','A区'),
('S002',20,'2019/1/1','B区'),
('S003',30,'2019/1/1','C区'),
('S004',40,'2019/1/2','A区'),
('S005',10,'2019/1/2','B区'),
('S006',20,'2019/1/2','C区'),
('S007',30,'2019/1/3','A区'),
('S008',40,'2019/1/3','C区');
得到以下的表格
如何返回每一天各个区域的订单价格“总量”
思考流程:
1.其实仔细观察,每天每个区域的价格已经是一个“总量”了,并不需要“加总”。
2.第三天B存在区域的销售额其实是个NULL值。
3.需要SELECT出time,并创建“A区域销售额”“B区域销售额”“C区域销售额”三个新字段。
4.要根据时间进行GROUP BY 。
5.拿'2019/1/1'A区销售额举例,需要使用‘条件’筛选后在这里返回一个结果,因此需要CASE WHEN函数。常见的用法是赋值和打标签,但这里显然都不是,常用的第三种配合聚合函数的用法。
6.我们知道,GROUP BY 的执行顺序是优先于SELECT的,以2019/1/1这天举例,实际是聚合了三个数据值“A区域”“B区域”“C区域”。所以用CASE WHEN可以很方便的做条件处理。
select
time
,SUM(case when area = 'A区' then price else 0 END) AS 'A区总价'
,SUM(case when area = 'B区' then price else 0 END) AS 'B区总价'
,SUM(case when area = 'C区' then price else 0 END) AS 'C区总价'
from tb_order2
GROUP BY time
#如果日期为2019/1/3 B区总价中不出现空值,也可以不出现else 0.
#使用MAX()聚合可以得到相同的结果
select
time
,MAX(case when area = 'A区' then price else 0 END) AS 'A区总价'
,MAX(case when area = 'B区' then price else 0 END) AS 'B区总价'
,MAX(case when area = 'C区' then price else 0 END) AS 'C区总价'
from tb_order2
GROUP BY time