sql - Oracle view - sum to variable -


how can shorten following select statement?

create or replace view v_amv_plg_quotes_50_ms  select      sum(nvl(ask_size,0))    ask_volume,   case when            sum(case when nvl(ask_size,0)=0 case when base_curr_ask_price=0 0 else 1 end else ask_size end)=0 1       else sum(case when nvl(ask_size,0)=0 case when base_curr_ask_price=0 0 else 1 end else ask_size end) end     ask_price,       exchange_sk         exchange_sk,      product_sk          product_sk,      business_date       business_date       s_amv_plg_quote_agg quotes  nvl(base_curr_ask_price ,0) > 0 group      exchange_sk,      product_sk,      business_date  

notice long calculation appears twice.. can insert variable somehow? , use case operator on variable? (notice have sum function there..)

you can't use create , use variable within view. if want avoid repeating nested case statement, move (and nvl) in-line view:

select      sum(my_ask_size)    ask_volume,      case when sum(my_ask_price)=0 1          else sum(my_ask_price)         end             ask_price,     exchange_sk         exchange_sk,      product_sk          product_sk,      business_date       business_date  (     select         exchange_sk, product_sk, business_date,         nvl(ask_size,0) my_ask_size,         case when nvl(ask_size,0)=0                 case when base_curr_ask_price=0 0 else 1 end             else ask_size             end my_ask_price      s_amv_plg_quote_agg quotes      nvl(base_curr_ask_price ,0) > 0 ) group      exchange_sk,      product_sk,      business_date; 

the nvl , case performed once, , aliased my_ask_size , my_ask_price respectively; , aliases used in outer query, including within sum.

if want avoid repeating sum too, move in-line view well, along group-by clause:

select      ask_volume          ask_volume,      case when ask_price=0 1         else ask_price         end             ask_price,     exchange_sk         exchange_sk,      product_sk          product_sk,      business_date       business_date  (     select         exchange_sk, product_sk, business_date,         sum(nvl(ask_size,0)) ask_volume,         sum(case when nvl(ask_size,0)=0                 case when base_curr_ask_price=0 0 else 1 end             else ask_size             end) ask_price      s_amv_plg_quote_agg quotes      nvl(base_curr_ask_price ,0) > 0     group          exchange_sk,          product_sk,          business_date ); 

most of column aliases redundant i've stuck pattern.

this largely cosmetic though; oracle's optimiser clever enough perform actual calculation once anyway, wouldn't expect see (or any) performance difference.


Comments

Popular posts from this blog

IF statement in MySQL trigger -

c++ - What does MSC in "// appease MSC" comments mean? -

javascript - Blogger related post gadget image Resize s72-c [ Need Expert Help ] -