sql查询每年每季度销售额前三的地区?

目标:想从订单表和客户表2张表中查询每年每个季度销售额最高的地区。
表单:客户表图片说明
订单表:图片说明

实现思路
第一步:将月转化为季度
第二步:按照年、季度分组对比,找出季度销售额前三的地区。

代码
SELECT sale.年,sale.季度,sale.省,sale.销售额
FROM
(SELECT YEAR(a.create_time) as 年,QUARTER(a.create_time) AS 季度,b.province AS 省,SUM(a.payment_amount) AS 销售额,COUNT(a.order_id) AS 订单数,AVG(a.payment_amount) as 平均单价
FROM order_info a INNER JOIN customer_info b
ON a.customer_id=b.customer_id
GROUP BY 年,季度,省) as sale) #对初始数据归类,形成新表
WHERE (SELECT count(*) FROM sale WHERE sale.=年 AND sale.季度=季度 AND sale.销售额<销售额)<3; #对归类后的数据按年、季度进行销售额对比,找出销售额前三的地区

问题
报错:1146 - Table 'online_sale.sale' doesn't exist, Time: 0.014000s

2个回答

tiankongzhichenglyf
tkzc_shark 回复喵---: WHERE (SELECT count(*) FROM sale WHERE sale.年=年 AND sale.季度=季度 AND sale.销售额<销售额)<3肯定不行啊
5 个月之前 回复
weixin_45559812
喵--- 谢谢呀,发现了quarter函数一下就简化了代码,但是还是没解决表不存在的问题
5 个月之前 回复

首先quarter()函数可以获取到季度,不用搞得那么麻烦。再用mysql实现开窗函数row_number() over (partition by xxx,xxx order by xxx),取到前三就行了。逻辑就是这样,不懂的再百度下吧

qq_37170555
听雨停了 回复喵---: 外面再套一个select * from (你的查询语句) as a ,然后再where。为什么要这样呢,是因为在select是在where之后执行,所以where的时候找不到这个列名也很正常
5 个月之前 回复
weixin_45559812
喵--- 了后,列不存在。
5 个月之前 回复
weixin_45559812
喵--- 回复听雨停了: SELECT *,row_number() over(PARTITION by 年,季度 ORDER BY 销售额) AS 地区销售排名 FROM (SELECT YEAR(a.create_time) as 年,QUARTER(a.create_time) AS 季度,b.province AS 省,SUM(a.payment_amount) AS 销售额,COUNT(a.order_id) AS 订单数,AVG(a.payment_amount) as 平均单价 FROM order_info a INNER JOIN customer_info b ON a.customer_id=b.customer_id GROUP BY 年,季度,省) AS T WHERE 地区销售排名<3;简化
5 个月之前 回复
qq_37170555
听雨停了 回复喵---: row_number()不就会得到一个列啊,取这个列<=3的就行了啊
5 个月之前 回复
weixin_45559812
喵--- 谢谢呀,已经用row_number函数分组排序了,但是怎么抽取每组前三呢?
5 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问