欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > sql_day14(获取各门店的面积)

sql_day14(获取各门店的面积)

2024/10/23 1:53:31 来源:https://blog.csdn.net/weixin_54353942/article/details/141000362  浏览:    关键词:sql_day14(获取各门店的面积)

描述:获取各门店的面积

  • 获取各门店的面积

  • 门店面积信息可以从分店面积明细表中获取。

    • 先取实际经营面积(8),

    • 如果取不到(实际经营面积为空)再取经营面积(7)。

    • 如果取不到(经营面积为空)再取合同面积(1)。

    • 如果取不到(合同面积为空)再取外滩面积(2)。

    • 总结一下: 优先级就是 8 > 7 > 1 > 2

输入:

输出:
 

数据准备:

-- 创建门店面积表 tb_store_area
CREATE TABLE tb_store_area (store_no     VARCHAR(50),area_type_no INT,area         INT
);-- 插入数据到门店面积表 tb_store_area
INSERT INTO tb_store_area (store_no, area_type_no, area) VALUES
('T065', 8, 135),
('T067', 8, 139),
('T065', 7, 157),
('T066', 7, 178),
('T068', 2, 178),
('T065', 1, 158),
('T066', 1, 160),
('T067', 1, 145);

分析:

法一:

①考虑到优先顺序为 8 > 7 > 1 > 2 ,那么就以这样的顺序赋值1,2,3,4

selectstore_no, area_type_no, area,casewhen area_type_no=8 then 1when area_type_no=7 then 2when area_type_no=1 then 3when area_type_no=2 then 4else 5end as type_num
from tb_store_area

②根据这个type_num进行分组排序

selectstore_no, area_type_no, area,row_number() over (partition by store_noorder by (casewhen area_type_no=8 then 1when area_type_no=7 then 2when area_type_no=1 then 3when area_type_no=2 then 4else 5end) asc) as rn
from db_1.tb_store_area

③筛选出rn为1的数据

select store_no, area from t2
where rn=1

法二:

①求出各门店area_8,area_7.area_1,area_2的面积,没有的话显示为0

selectstore_no,max(if(area_type_no=8, area, null)) as area_8,max(if(area_type_no=7, area, null)) as area_7,max(if(area_type_no=1, area, null)) as area_1,max(if(area_type_no=2, area, null)) as area_2
from tb_store_area
group by store_no

②使用函数coalesce(area_8, area_7, area_1, area_2) 筛选出各门店第一个不为null的值

selectstore_no,coalesce(area_8, area_7, area_1, area_2) as area
from t1

代码:

# 法一
with t2 as (selectstore_no, area_type_no, area,row_number() over (partition by store_noorder by (casewhen area_type_no=8 then 1when area_type_no=7 then 2when area_type_no=1 then 3when area_type_no=2 then 4else 5end) asc) as rnfrom db_1.tb_store_area
)
select store_no, area from t2
where rn=1
;# 法二
with t1 as (selectstore_no,max(if(area_type_no=8, area, null)) as area_8,max(if(area_type_no=7, area, null)) as area_7,max(if(area_type_no=1, area, null)) as area_1,max(if(area_type_no=2, area, null)) as area_2from tb_store_areagroup by store_no
)
selectstore_no,coalesce(area_8, area_7, area_1, area_2) as area
from t1
;

总结:

① 通过分组然后根据多个 max(if(area_type_no=n, area, null)) 拼接出各门店的数据,将列变行

②coalesce(列1,列2,...)函数的使用 返回若干列里不为null的第一个值

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com