把相关表进行关联查询,对省份进行分组,并统计销售额。
fact_order_detail 为订单表,订单表中 order_datetime为订单时间,store_id为店铺标示,所以q1每个月每个省份的销售额就是订单表与店铺表关联,再与城市表关联,为了获得省份名称,还要与省份表关联,并按照order_datetime的年月和省份表的province_name分组group
select province_name as 省份,year(order_datetime) as 年,month(order_datetime) as 月,sum(quantity*unit_price) as 销售额
from fact_order_detail o
left join dim_store s on o.store_id=s.store_id
left join dim_city c on s.city_id=c.city_id
left join dim_province p on p.province_id=c.province_id
group by year(order_datetime),month(order_datetime),province_name
q2的问题类似,不过是按产品分组,不再区分城市、省份,所以只是fact_order_detail和dim_product关联即可,然后将每个产品的销售额汇总后比上总销售额,可以用临时表或cte表辅助,这样就不用多条sql指令了
q3和q2类似,每个月的总销售额用cte查询,然后使用cte查询每个月比上个月的数据即可
with t as (
-- 获取每个月的销售额
select date_format(order_datetime,'%Y%m') as 年月
,sum(quantity*unit_price) as 销售额
from fact_order_detail
group by date_format(order_datetime,'%Y%m')
),t1 as (
-- 为了环比,我们需要知道每个月的上一个月的月份
select *,period_add(年月,-1) as 前月
from t
)
-- 开始环比
select a.年月,a.销售额,b.销售额 as 上月销售额
,(a.销售额-b.销售额)/b.销售额 as 环比结果
from t1 a
left join t1 b on a.前月=b.年月
-- 如果没有上个月销售额,则无法环比
-- 比如新店第一个月,中间闭店超过1个月等
where b.销售额 is not null
q4也差不多
with t as (
select u.user_id,u.user_name,date_format(order_datetime,'%Y%m') as 年月,1 as 有交易记录
from fact_order_detail o
left join dim_user u on o.user_id=u.user_id
group by date_format(order_datetime,'%Y%m'),u.user_id,u.user_name
),t1 as (
select a.*,ifnull(b.有交易记录,0) as 上月有交易记录
from t a
left join t b on period_add(a.年月,-1)=b.年月
),t2 as (
select sum(case when 上月有交易记录=0 then 1 else 0 end) as 新用户
,sum(case when 上月有交易记录=1 then 1 else 0 end) as 留存用户
,count(0) as 本月交易人数
from t1
group by 年月
)
select a.*,a.留存用户/b.本月交易人数 as 留存率
from t2 a
left join t2 b on period_add(a.年月,-1)=b.年月
1-2题用左联结,3-4用自联结
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
这是作业帮吗?