聚集导航出错

阅读更多

今天遇到一件很奇怪的事情:

同样的报表,在访问时,数据差异很大。

唯一做的变更是,之前底层走的是tsa_fact_punish_rstb表。现在走的是tsa_fact_punish_rdys表。

希望利用biee模型成的聚集导航,当查询特定的维度时,走相应的聚合表。

 

一开始怀疑,是tsa_fact_punish_rdys表的计算有问题,但是实际上该表是利用kettle进行简单的聚合得到的。

反复查了几次,发现底层的数据没有问题。

 

后来只能怀疑是前台的报表bug了。查看发出的sql分析,基本上关联的表是差不多的。后来仔细分析,发现在前台报表层面虽然增加了bc_type=1的判断,但是发出的sql里,走tsa_fact_punish_rdys表的查询语句,竟然没有该条件限制。导致算出来的数据偏大。

正确的sql如下:

select T4707.year_id as c1,
     T4707.month_id as c2,
     T4707.date_id as c3,
     T4635.cat_level_1_name as c4,
     case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end  as c5,
     sum(T17117.all_new_num) as c6
from 
     tsa_dim_time T4707,
     tsa_dim_punish_reason T4645,
     tsa_dim_product_category T4635,
     tsa_fact_punish_rstb T17117
where  ( T4635.cat_id = T17117.product_category_id and T4645.reason_id = T17117.reason_id and T4707.date_id = T17117.date_id and T17117.bc_type = 1 and T4635.cat_level_1_name <> '手机号码/套餐/增值业务' and T4635.cat_level_1_name <> '移动/联通/电信充值中心' and T4635.cat_level_1_name <> '网游垂直市场根类目' and T4635.cat_level_1_name <> '网游装备/游戏币/帐号/代练' and T4635.cat_level_1_name <> '网络游戏点卡' and T4635.cat_level_1_name <> '腾讯QQ专区' and T4645.reason_2_name <> '消费者保障服务(商城,虚拟)' and T4645.reason_2_name <> '消费者保障服务(集市,虚拟)' and case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end  <> '其他' and 0 < T4635.status and T4707.date_id between {d '2011-07-18'} and {d '2011-07-24'} and T17117.date_id between {d '2011-07-18'} and {d '2011-07-24'} ) 
group by T4635.cat_level_1_name, T4707.date_id, T4707.month_id, T4707.year_id, case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end 

 

错误的sql:

select T4707.year_id as c1,
     T4707.month_id as c2,
     T4707.date_id as c3,
     T4635.cat_level_1_name as c4,
     case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end  as c5,
     sum(T21533.all_new_num) as c6
from 
     tsa_dim_time T4707,
     tsa_dim_punish_reason T4645,
     tsa_dim_product_category T4635,
     tsa_fact_punish_rdys T21533
where  ( T4635.cat_id = T21533.product_category_id and T4645.reason_id = T21533.reason_id and T4707.date_id = T21533.date_id and T4635.cat_level_1_name <> '手机号码/套餐/增值业务' and T4635.cat_level_1_name <> '移动/联通/电信充值中心' and T4635.cat_level_1_name <> '网游垂直市场根类目' and T4635.cat_level_1_name <> '网游装备/游戏币/帐号/代练' and T4635.cat_level_1_name <> '网络游戏点卡' and T4645.reason_2_name <> '消费者保障服务(商城,虚拟)' and T4645.reason_2_name <> '消费者保障服务(集市,虚拟)' and case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end  <> '其他' and T4635.cat_level_1_name <> '腾讯QQ专区' and 0 < T4635.status and T4707.date_id between {d '2011-07-18'} and {d '2011-07-24'} and T21533.date_id between {d '2011-07-18'} and {d '2011-07-24'} ) 
group by T4635.cat_level_1_name, T4707.date_id, T4707.month_id, T4707.year_id, case  when T4645.reason_1_name in ('售后保障服务', '未收到货') then '售后投诉' when T4645.reason_1_name in ('延迟发货', '违背承诺') then '规则类投诉' else '其他' end 

 以上两条sql的不同点,除了走的聚合表不同外,就是条件bc_type的区别了。

 

初步分析:tsa_fact_punish_rdys表里没有bc_type字段,在聚集导航判断时,可以走这张表,竟然把这个条件直接去掉了。之前以为,没有字段映射到的话,会走符合条件的另外一个表的。这还是第一次遇到这种情况。有点诡异。

 

解决方案:在tsa_fact_punish_rdys表中增加bc_type字段,应该可以保证限制条件不丢。

 

后面再分析下,为什么会出现这种情况?

你可能感兴趣的:(SQL,互联网,BIEE)