2014-11-20 34 views
1

我有一个问题,我如何评估一个SQL,当ID = 5的情况下,'目录援助'它应该得到attr_1作为输出和ID = 5和'长漫游'它应该给attr_35/60。如何解码具有相同条件与多个条件与差异结果

sum(decode(id,1,attr_35/60, 
     5,'Long Roaming',attr_35/60, 
     5,'Directory Assistance',attr_1))total 


with ce as 
(
select case 
    when id = 1 and attr_31 like 'Roam%' 
     then 'A1' 
    when id = 5 and attr_30 like 'Dir%' and attr_31 like 'Standard%' 
     then 'Directory Assistance' 
    when id = 5 and attr_30 like 'Dir%' and attr_31 like 'Roam%' 
     then 'Directory Assistance Roaming' 
    when id = 5 and attr_30 like 'Long Distance%' and attr_31 like 'Roam%' 
     then 'Long Roaming' 
    end usagetype 

    , sum(decode(id,1,attr_35/60, 5,attr_35/60)) total 
    from table 
     where ce.account_num in ('A4','A5','A6') 

    group by 
    case 
    when id = 1 and attr_31 like 'Roam%' 
     then 'A1' 
    when id = 5 and attr_30 like 'Dir%' and attr_31 like 'Standard%' 
     then 'Directory Assistance' 
    when id = 5 and attr_30 like 'Dir%' and attr_31 like 'Roam%' 
     then 'Directory Assistance Roaming' 
    when id = 5 and attr_30 like 'Long Distance%'and attr_31 like 'Roam%' 
     then 'Long Roaming' 
    end 
    ) 
select usagetype,total from ce 

回答

0

首先,我封装的情况下的逻辑,再加上你可能需要在你的CTE任何其他列:

with ce as 
(
    select 

    case 
     when id = 1 and attr_31 like 'Roam%' 
     then 'A1' 
     when id = 5 and attr_30 like 'Dir%' and attr_31 like 'Standard%' 
     then 'Directory Assistance' 
     when id = 5 and attr_30 like 'Dir%' and attr_31 like 'Roam%' 
     then 'Directory Assistance Roaming' 
     when id = 5 and attr_30 like 'Long Distance%' and attr_31 like 'Roam%' 
     then 'Long Roaming' 
     else '-' 
    end usagetype 

    , id 
    , attr_30 
    , attr_31 
    , attr_35 

    from table 
    where ce.account_num in ('A4','A5','A6') 
) 

然后,通过在CTE执行组(这样就不必写CASE逻辑两次): -

select 
usagetype 
-- , <sum term will go here> 
from ce group by usagetype 

第三,由于解码可以对单个列/值每次只工作,你将需要第二个case

select 

    usagetype 
    , sum(case 
     when id = 1 then 
      attr_35/60 
     when id = 5 and usagetype = 'Long Roaming' then 
      attr_35/60 
     when id = 5 and usagetype = 'Directory Assistance' then 
      attr_1 
     else 
      0 
     end) as total_result 

from ce group by usagetype 

然后,你可以在你的情况结合起来,第一项和第二项:

select 

    usagetype 
    , sum(case 
     when id = 1 or (id = 5 and usagetype = 'Long Roaming') then 
      attr_35/60 
     when id = 5 and usagetype = 'Directory Assistance' then 
      attr_1 
     else 
      0 
     end) as total_result 

from ce group by usagetype