Как агрегировать значения при получении взвешенных средних в Oracle? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть требование вывести процент потребления, логика которого основана на взвешенных средних. Ниже приведен код, который я запускаю. Я пытаюсь выяснить значение поля Consensus_Plan_Consump_pc на другом уровне агрегации. Это может быть неделя, месяц, год и т. Д. Однако, если я запускаю приведенный ниже код, я вижу 12 значений для 1 года, в основном из-за поля inp.t_ep_fiscal_month_id, которое дает мне финансовые месяцы. Я хочу знать, как мне написать код, чтобы он сам агрегировал, когда пользователь требует его на уровне месяца, года или квартала.

SELECT item1.item,
    fiscal_year,inp.t_ep_fiscal_month_id , curr_fscl_month.t_ep_fiscal_month_id,
case when inp.t_ep_fiscal_month_id < curr_fscl_month.t_ep_fiscal_month_id 
        then 
        (sum(nvl(sales.actual_quantity, 0) *1 ) / sum( sales.xxdm_dp_plan_pm *1))
        else 
        ( 
        case when 
        (sum(case when from_unixtime(unix_timestamp(sales.sales_date), 'yyyyMMdd') <curr_fscl_month.pval then nvl(sales.actual_quantity, 0)
        else
        DECODE(NVL(sales.xxdm_cons_flag,1)
        ,1,NVL(sales.wcp_override, 0) + NVL(sales.xxdm_ref_dp_override, 0) + NVL( sales.xxdm_asia_dp_override , 0 )
        ,NVL(sales.xxdm_combined_fcst,0))
        end )) > 0 
        then (sum(nvl(sales.actual_quantity,0) + nvl(xxdm_open_orders,0))) / ((sum(case when from_unixtime(unix_timestamp(sales.sales_date), 'yyyyMMdd') <curr_fscl_month.pval then nvl(sales.actual_quantity, 0)
        else
        DECODE(NVL(sales.xxdm_cons_flag,1)
        ,1,NVL(sales.wcp_override, 0) + NVL(sales.xxdm_ref_dp_override, 0) + NVL( sales.xxdm_asia_dp_override , 0 )
        ,NVL(sales.xxdm_combined_fcst,0))
        end )))
        end
        ) Consensus_Plan_Consumption_pc
FROM prod_corp_frank.sales_data sales
LEFT OUTER JOIN prod_comres_sc_core.xxdm_dm_comb_v app ON (sales.item_id = app.item_id AND sales.location_id = app.location_id)
LEFT OUTER JOIN
  (
  SELECT inp.datet,
          fs_month.T_EP_FISCAL_MONTH_CODE fiscal_month,
          fs_week.T_EP_FISCAL_WEEK_CODE fiscal_week,
          fs_quarter.T_EP_FISCAL_quarter_CODE fiscal_quarter,
          inp.t_ep_fiscal_year_id fiscal_year,
          inp.t_ep_fiscal_month_id
   FROM prod_corp_frank.inputs inp
   LEFT OUTER JOIN prod_corp_frank.t_ep_fiscal_month fs_month ON (inp.t_ep_fiscal_month_id = fs_month.t_ep_fiscal_month_id)
   LEFT OUTER JOIN prod_corp_frank.t_ep_fiscal_week fs_week ON (inp.t_ep_fiscal_week_id = fs_week.t_ep_fiscal_week_id)
   LEFT OUTER JOIN prod_corp_frank.t_ep_fiscal_quarter fs_quarter ON (inp.t_ep_fiscal_quarter_id = fs_quarter.t_ep_fiscal_quarter_id)
   ) inp 
   ON (from_unixtime(unix_timestamp(sales.sales_date), 'yyyyMMdd') = from_unixtime(unix_timestamp(inp.datet), 'yyyyMMdd'))
LEFT OUTER JOIN prod_comres_sc_core.xxdm_dm_item_v item1 ON (sales.item_id = item1.item_id)
LEFT OUTER JOIN prod_corp_frank.t_ep_item tand1 on (item1.xxdm_tandem_item1=tand1.t_ep_item_ep_id)
LEFT OUTER JOIN prod_corp_frank.t_ep_item tand2 on (item1.xxdm_tandem_item2=tand2.t_ep_item_ep_id)
LEFT OUTER JOIN prod_corp_frank.t_ep_item tand3 on (item1.xxdm_tandem_item3=tand3.t_ep_item_ep_id)
LEFT OUTER JOIN prod_comres_sc_core.xxdm_dm_loc_v loc ON sales.location_id = loc.location_id,
(
select from_unixtime(unix_timestamp(sys.pval,'MM-dd-yyyy'), 'yyyyMMdd') pval,
inp1.t_ep_fiscal_month_id
from prod_corp_frank.SYS_PARAMS sys,
prod_corp_frank.inputs inp1
where pname='min_fore_sales_date'
and from_unixtime(unix_timestamp(sys.pval,'MM-dd-yyyy'), 'yyyyMMdd')
= from_unixtime(unix_timestamp(inp1.datet), 'yyyyMMdd')
) curr_fscl_month --calculate current fiscal_month
WHERE item1.item='ZP98'
and fiscal_year between 2016 and 2019
    GROUP BY item1.item,
    fiscal_year,
    inp.t_ep_fiscal_month_id,
    curr_fscl_month.t_ep_fiscal_month_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...