1.需求
将图一 数据 加工成 图二的数据
图一:
图二:
IS_SD_CALL/IS_ZB_WOSALE/IS_CBSS 字段下的数字 表示权重,数字越大权重越高,权重最高的那一行留下 ,其他行消除。
2. 解决
整体解决方案:
select
x.no ,x.number ,
case when x.IS_SD_CALL <> '' and x.IS_SD_CALL = '10' then '是' else '' end as IS_SD_CALL,
case when x.IS_ZB_WOSALE <> '' and x.IS_ZB_WOSALE = 5 and x.IS_SD_CALL = '' then '是' else '' end as IS_ZB_WOSALE,
case when x.IS_CBSS <> '' and x.IS_CBSS = 1 and x.IS_SD_CALL = '' and x.IS_ZB_WOSALE = '' then '是' else '' end as IS_CBSS
from (
select
no ,number
max(IS_SD_CALL ) IS_SD_CALL ,
max(IS_ZB_WOSALE ) IS_ZB_WOSALE ,
max(IS_CBSS ) IS_CBSS
from cbss_call_wosale_detail_tmp t
group by no ,number
) x ;
解释:
1.
select
no ,number
max(IS_SD_CALL ) IS_SD_CALL ,
max(IS_ZB_WOSALE ) IS_ZB_WOSALE ,
max(IS_CBSS ) IS_CBSS
from cbss_call_wosale_detail_tmp t
group by no ,number
此sql 是根据 no,number 进行分组查询,并且取每一列最大值,也就是分组查询完成后,会把权重数字都留到了一行,就如同下面这样:
2.因为要把权重最高的那列设为 是 ,其他的置为空,则使用case when 来进行判断(三列中只能有一个是,其他的均为 空 )
select
x.no ,x.number ,
case when x.IS_SD_CALL <> '' and x.IS_SD_CALL = '10' then '是' else '' end as IS_SD_CALL,
case when x.IS_ZB_WOSALE <> '' and x.IS_ZB_WOSALE = 5 and x.IS_SD_CALL = '' then '是' else '' end as IS_ZB_WOSALE,
case when x.IS_CBSS <> '' and x.IS_CBSS = 1 and x.IS_SD_CALL = '' and x.IS_ZB_WOSALE = '' then '是' else '' end as IS_CBSS
from (
select
no ,number
max(IS_SD_CALL ) IS_SD_CALL ,
max(IS_ZB_WOSALE ) IS_ZB_WOSALE ,
max(IS_CBSS ) IS_CBSS
from cbss_call_wosale_detail_tmp t
group by no ,number
) x ;
完。
若有错误,希望大佬指出。
对你有帮助给点个👍再走呗。