From 47d1baffc5366b66e0c9968efc0a6daeb3734100 Mon Sep 17 00:00:00 2001 From: PhilRunninger Date: Wed, 17 May 2023 05:28:21 -0400 Subject: [PATCH] Handle the case where baseline is zero (units or value). This happens when a customer places identical orders and specifies that they be shipped in different seasons. We end up with one order shipped in 2023 and one open for 2024. Under our current operating procedures, open orders are subtracted from shipped orders and are presented as baseline for the next forecast. The zero that appears in the baseline in this case was causing all kinds of issues in the SQL scripts for inserting the adjustments, ranging from finding zero rows to adjust to division by zero. Another change required to correct this was updating the iter value of the open orders from 'actuals' to 'copy': UPDATE rlarp.osm_pool SET iter = 'copy' WHERE tag = 'open-orders' --- route_sql/addmonth_vupd.sql | 159 +++++++++++++++++++++++------------- route_sql/new_basket.sql | 44 ++++++---- route_sql/scale_pd.sql | 57 +++++++------ route_sql/scale_vd.sql | 59 +++++++++---- route_sql/scale_vupd.sql | 107 +++++++++++++++--------- 5 files changed, 278 insertions(+), 148 deletions(-) diff --git a/route_sql/addmonth_vupd.sql b/route_sql/addmonth_vupd.sql index 5a7c073..c2ffa8f 100644 --- a/route_sql/addmonth_vupd.sql +++ b/route_sql/addmonth_vupd.sql @@ -8,8 +8,8 @@ target AS (select target_volume vincr, target_price pincr) sum(units) tot ,sum(units) FILTER (WHERE iter IN ('copy','plan','diff')) base ,COALESCE(sum(units) FILTER (WHERE module = 'new basket'),0) newpart - ,sum(value_loc *r_rate) totsales - ,sum(value_loc *r_rate) FILTER (WHERE iter IN ('plan','diff','copy')) basesales + ,coalesce(sum(value_loc *r_rate),0) totsales + ,coalesce(sum(value_loc *r_rate) FILTER (WHERE iter IN ('plan','diff','copy')),0) basesales ,COALESCE(sum(value_loc *r_rate) FILTER (WHERE module = 'new basket'),0) newpartsales FROM rlarp.osm_pool @@ -18,8 +18,10 @@ target AS (select target_volume vincr, target_price pincr) where_clause -----------------additional params------------------- AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date + AND (order_date <= ship_date OR tag = 'open-orders') ) +-- select * from testv +-- ,flagv AS ( SELECT tot @@ -54,28 +56,32 @@ target AS (select target_volume vincr, target_price pincr) FROM testv ) +-- select * from flagv +-- ,GLD AS MATERIALIZED ( - SELECT - N1COMP COMP - ,N1CCYY FSYR - ,KPMAXP PERDS - ,N1FSPP PERD - ,to_char(N1FSYP,'FM0000') FSPR - ,N1SD01 SDAT - ,N1ED01 EDAT + SELECT + N1COMP COMP + ,N1CCYY FSYR + ,KPMAXP PERDS + ,N1FSPP PERD + ,to_char(N1FSYP,'FM0000') FSPR + ,N1SD01 SDAT + ,N1ED01 EDAT ,daterange(n1sd01, n1ed01,'[]') drange - ,to_char(N1ED01,'yymm') CAPR - ,N1ED01 - N1SD01 +1 NDAYS - ,CASE WHEN EXTRACT(MONTH FROM N1ED01) >= 6 THEN EXTRACT(YEAR FROM N1ED01) + 1 ELSE EXTRACT(YEAR FROM N1ED01) END SSYR - ,to_char(CASE WHEN EXTRACT(MONTH FROM N1ED01) >= 6 THEN EXTRACT(MONTH FROM N1ED01) -5 ELSE EXTRACT(MONTH FROM N1ED01) +7 END,'FM00') SSPR - FROM - LGDAT.GLDATREF - INNER JOIN LGDAT.GLDATE ON - KPCOMP = N1COMP AND - KPCCYY = N1CCYY - WHERE - N1COMP = 93 + ,to_char(N1ED01,'yymm') CAPR + ,N1ED01 - N1SD01 +1 NDAYS + ,CASE WHEN EXTRACT(MONTH FROM N1ED01) >= 6 THEN EXTRACT(YEAR FROM N1ED01) + 1 ELSE EXTRACT(YEAR FROM N1ED01) END SSYR + ,to_char(CASE WHEN EXTRACT(MONTH FROM N1ED01) >= 6 THEN EXTRACT(MONTH FROM N1ED01) -5 ELSE EXTRACT(MONTH FROM N1ED01) +7 END,'FM00') SSPR + FROM + LGDAT.GLDATREF + INNER JOIN LGDAT.GLDATE ON + KPCOMP = N1COMP AND + KPCCYY = N1CCYY + WHERE + N1COMP = 93 ) +-- select * from gld +-- ,mseq AS ( SELECT * FROM ( @@ -94,6 +100,8 @@ target AS (select target_volume vincr, target_price pincr) ,('12 - May',12,5,0) ) x(m,s,cal,yr) ) +-- select * from mseq +-- ,alldates AS MATERIALIZED( SELECT promo @@ -118,7 +126,7 @@ target AS (select target_volume vincr, target_price pincr) WHEN 'scale new part' THEN module = 'new basket' END AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date + AND (order_date <= ship_date AND tag <> 'open-orders') GROUP BY promo ,terms @@ -127,10 +135,11 @@ target AS (select target_volume vincr, target_price pincr) ,order_date ,request_date ,ship_date - HAVING - sum(CASE (SELECT flagsales FROM flagv) WHEN 'no price'THEN 1.0 ELSE value_usd END) <> 0 + -- HAVING + -- sum(CASE (SELECT flagsales FROM flagv) WHEN 'no price'THEN 1.0 ELSE value_usd END) <> 0 ) ---select * from alldates +-- select * from alldates +-- ,dom AS ( SELECT extract(day FROM order_date) DOM @@ -140,6 +149,8 @@ target AS (select target_volume vincr, target_price pincr) GROUP BY extract(day FROM order_date) ) +-- select * from dom +-- ---------------------may want ot look at a top-5 mix solution in the future facilitated by sum() over (order by sales desc)--------------- ,mmix AS ( SELECT @@ -151,18 +162,19 @@ target AS (select target_volume vincr, target_price pincr) ,sum((request_date-order_date)*(value_usd)) rlag_wa --,ship_date - request_date slag ,sum((ship_date - request_date)*(value_usd)) slag_wa - ,sum(value_usd) value_usd + ,coalesce(nullif(sum(value_usd),0),1) value_usd FROM alldates GROUP BY to_char(order_date,'Mon') ,seq ,promo - --,extract(day from order_date) - --,request_date-order_date - --,ship_date - request_date ) -,targm AS (select s, m from mseq where m = 'target_month' ) +-- select * from mmix +-- +,targm AS (select s, m from mseq where m = '04 - Sep' ) +-- select * from targm +-- ,mmixp AS ( SELECT _month @@ -172,10 +184,11 @@ target AS (select target_volume vincr, target_price pincr) ,round((rlag_wa/value_usd)::numeric,0)::int rlag ,round((slag_wa/value_usd)::numeric,0)::int slag ,value_usd/sum(value_usd) over (partition by _month) momix - --,value_usd/SUM(value_usd) over (PARTITION BY _month) vperc FROM mmix ) +-- select * from mmixp +-- ,closest AS ( SELECT _month, targm.s, m @@ -186,6 +199,8 @@ target AS (select target_volume vincr, target_price pincr) abs(seq - targm.s) ASC LIMIT 1 ) +-- select * from closest +-- ---------------------the role of basemix here is to get non-dated info which is then dated in the next step--------------------- ,basemix AS ( SELECT @@ -241,7 +256,7 @@ SELECT WHEN 'scale new part' THEN module = 'new basket' END AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date + AND (order_date <= ship_date AND tag <> 'open-orders') GROUP BY --fspr in next step o.plnt @@ -276,16 +291,33 @@ SELECT ,o.calc_status ,o.flag ) +-- select * from basemix +-- ,vscale AS ( SELECT (SELECT vincr::numeric FROM target) incr ,(SELECT sum(units) FROM basemix) base - ,(SELECT vincr::numeric FROM target)/(SELECT sum(units) FROM basemix) factor + -- If sum(units) = 0, then we're likely working with a single row. We can't + -- scale 0, no matter how we try, so we just use mod_volume to set the value we want. + -- When sum(units) <> 0, then we use factor to scale units. + ,CASE + WHEN (SELECT sum(units)::numeric FROM basemix) = 0 + THEN 0 + ELSE (SELECT vincr::numeric FROM target)/(SELECT sum(units)::numeric FROM basemix) + END AS factor + ,CASE + WHEN (SELECT sum(units)::numeric FROM basemix) = 0 + THEN (SELECT vincr::numeric FROM target) + ELSE 0 + END AS mod_volume ) ---select * from SCALE +-- select * from vscale +-- ,log AS ( INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * ) +-- select * from log +-- ,volume AS ( SELECT sd.fspr @@ -317,7 +349,7 @@ SELECT ,b.r_rate ,b.c_currency ,b.c_rate - ,round(b.units*s.factor*m.momix ,2) units + ,round((CASE WHEN s.factor = 0 THEN s.mod_volume ELSE b.units*s.factor END)*m.momix, 2) units ,round(b.value_loc*s.factor*m.momix,2) value_loc ,round(b.value_usd*s.factor*m.momix,2) value_usd ,round(b.cost_loc*s.factor*m.momix ,2) cost_loc @@ -339,7 +371,11 @@ SELECT ,COALESCE(log.doc->>'tag','') "tag" ,log.doc->>'message' "comment" ,log.doc->>'type' module - ,round(b.pounds*s.factor*m.momix, 2) pounds + ,round(CASE + WHEN s.factor = 0 THEN s.mod_volume * i.nwht * (CASE i.nwun + WHEN 'KG' THEN 2.2046 + ELSE 1 END) + ELSE b.pounds*s.factor END, 2) pounds FROM basemix b CROSS JOIN vscale s @@ -354,29 +390,30 @@ FROM make_date(mseq.yr + 2024,mseq.cal,m.odom) + rlag BETWEEN rd.sdat AND rd.edat LEFT OUTER JOIN gld sd ON make_date(mseq.yr + 2024,mseq.cal,m.odom) + rlag + slag BETWEEN sd.sdat AND sd.edat + LEFT OUTER JOIN "CMS.CUSLG".itemm i ON i.item = b.part WHERE m._month = (SELECT _month FROM closest) ) +-- select * from volume +-- ,pscale AS ( SELECT - (SELECT pincr::numeric FROM target) incr - ,(SELECT sum(value_loc * r_rate) FROM volume) base - ,CASE WHEN (SELECT sum(value_loc * r_rate) FROM volume) = 0 THEN - 0 - ELSE - ((SELECT pincr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM volume))/(SELECT sum(value_loc * r_rate) FROM volume) + CASE + WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 AND (SELECT sum(units) FROM volume) = 0 THEN 'both' + WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 THEN 'cost' + ELSE 'other' + END zero_values + ,CASE + WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 AND (SELECT coalesce(sum(units),0) FROM volume) = 0 -- Split pincr evenly between rows. + THEN (SELECT pincr::numeric FROM target) / (SELECT count(*) FROM volume) + WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 -- Get a per-unit pincr value + THEN (SELECT pincr::numeric FROM target) / (SELECT sum(units) FROM volume) + ELSE -- Find percent change for existing value_loc + (SELECT pincr::numeric FROM target) / (SELECT nullif(sum(value_loc * r_rate),0) FROM volume) - 1 END factor - ,CASE WHEN (SELECT sum(value_loc * r_rate) FROM volume) = 0 THEN - CASE WHEN ((SELECT pincr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM volume)) <> 0 THEN - --if the base value is -0- but the target value hasn't been achieved, derive a price to apply - ((SELECT pincr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM volume))/(SELECT sum(units) FROM volume) - ELSE - 0 - END - ELSE - 0 - END mod_price ) +-- select * from pscale +-- ,price AS ( SELECT b.fspr @@ -409,8 +446,16 @@ SELECT ,b.c_currency ,b.c_rate ,0::numeric units - ,round((CASE WHEN p.factor = 0 THEN b.units * p.mod_price/b.r_rate ELSE b.value_loc*p.factor END)::numeric,2) value_loc - ,round((CASE WHEN p.factor = 0 THEN b.units * p.mod_price ELSE b.value_usd*p.factor END)::numeric ,2) value_usd + ,round(CASE p.zero_values + WHEN 'both' THEN p.factor / b.r_rate + WHEN 'cost' THEN b.units * p.factor / b.r_rate + WHEN 'other' THEN b.value_loc * p.factor + END, 2) AS value_loc + ,round(CASE p.zero_values + WHEN 'both' THEN p.factor + WHEN 'cost' THEN b.units * p.factor + WHEN 'other' THEN b.value_usd * p.factor + END, 2) AS value_usd ,0::numeric cost_loc ,0::numeric cost_usd ,b.calc_status @@ -436,8 +481,10 @@ FROM CROSS JOIN pscale p CROSS JOIN log WHERE - p.factor <> 0 or p.mod_price <> 0 + p.factor <> 0 ) +-- SELECT * FROM price UNION ALL SELECT * FROM volume +-- , ins AS ( INSERT INTO rlarp.osm_pool (SELECT * FROM price UNION ALL SELECT * FROM volume) RETURNING * ) diff --git a/route_sql/new_basket.sql b/route_sql/new_basket.sql index c081570..5c4395d 100644 --- a/route_sql/new_basket.sql +++ b/route_sql/new_basket.sql @@ -1,10 +1,10 @@ --- Connection: usmidsap01.ubm WITH /* the volume must be expressed in terms of units, since that is what it will be scaling */ target AS (select $$replace_request$$::json def) ---select * from newm +-- select * from target +-- ,GLD AS ( SELECT N1COMP COMP @@ -29,6 +29,8 @@ target AS (select $$replace_request$$::json def) N1COMP = 93 --AND DIGITS(N1FSYP) = '1901' ) +-- select * from GLD +-- ,mseq AS ( SELECT * FROM ( @@ -47,6 +49,8 @@ target AS (select $$replace_request$$::json def) ,('12 - May',12,5,0) ) x(m,s,cal,yr) ) +-- select * from mseq +-- ,seg AS ( SELECT x.GLEC glec @@ -71,6 +75,8 @@ target AS (select $$replace_request$$::json def) ('9TO','Other') ) X(GLEC, SEGM) ) +-- select * from seg +-- ,copr AS ( SELECT LTRIM(RTRIM(A9)) AS COMP, @@ -91,6 +97,8 @@ target AS (select $$replace_request$$::json def) WHERE A2 = 'AA' OR A2 IS NULL ) +-- select * from copr +-- ,alldates AS ( SELECT promo @@ -112,7 +120,7 @@ target AS (select $$replace_request$$::json def) --probably dont want to include adjustments that have blown away volume and good sources of dating info -----------------additional params------------------- AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date + AND (order_date <= ship_date AND tag <> 'open-orders') GROUP BY promo ,terms @@ -122,10 +130,11 @@ target AS (select $$replace_request$$::json def) ,order_date ,request_date ,ship_date - HAVING - sum(value_usd) <> 0 + -- HAVING + -- sum(value_usd) <> 0 ) ---select * from alldates +-- select * from alldates +-- ,dom AS ( SELECT extract(day FROM order_date) DOM @@ -135,8 +144,8 @@ target AS (select $$replace_request$$::json def) GROUP BY extract(day FROM order_date) ) ---select * from dom ----------------------may want ot look at a top-5 mix solution in the future facilitated by sum() over (order by sales desc)--------------- +-- select * from dom +-- ,mmix AS ( SELECT to_char(order_date,'Mon') _month @@ -150,7 +159,7 @@ target AS (select $$replace_request$$::json def) ,sum((request_date-order_date)*(value_usd)) rlag_wa --,ship_date - request_date slag ,sum((ship_date - request_date)*(value_usd)) slag_wa - ,sum(value_usd) value_usd + ,COALESCE(nullif(sum(value_usd),0),1) value_usd FROM alldates GROUP BY @@ -162,7 +171,8 @@ target AS (select $$replace_request$$::json def) --,request_date-order_date --,ship_date - request_date ) ---select * from mmix +-- select * from mmix +-- ,targm AS ( SELECT je.key as month @@ -179,6 +189,7 @@ target AS (select $$replace_request$$::json def) mseq.m = je.key ) --select * from targm +-- ,mmixp AS ( SELECT _month @@ -195,7 +206,7 @@ target AS (select $$replace_request$$::json def) mmix ) --select * from mmixp ---month cross join mix +-- ,mxm AS ( SELECT t.month @@ -224,8 +235,8 @@ FROM LIMIT 1 ) ) ---SELECT * FROM mxm ---this basemix is probably join going to be part-bill-ship with all master data joined later since it is not known if any original is salvaged +-- SELECT * FROM mxm +-- ,basemix AS ( SELECT sd.fspr @@ -261,10 +272,13 @@ SELECT LEFT OUTER JOIN gld sd ON sd.drange @> (make_date(mxm.yr + 2024,mxm.cal,mxm.odom) + rlag + slag) ) ---SELECT * FROM basemix +-- SELECT * FROM basemix +-- ,log AS ( INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * ) +-- select * from log +-- ,final AS ( SELECT b.fspr @@ -390,6 +404,8 @@ FROM AND rx.fcur = COALESCE(bc.bvcurr,b.r_currency) AND rx.tcur = 'US' ) +-- select * from final +-- , ins AS ( INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING * ) diff --git a/route_sql/scale_pd.sql b/route_sql/scale_pd.sql index 1680c56..1aef3fe 100644 --- a/route_sql/scale_pd.sql +++ b/route_sql/scale_pd.sql @@ -28,9 +28,9 @@ target AS (select target_increment incr) ,substance ,fs_line --master data ,r_currency --history cust mix - ,r_rate --master data + ,coalesce(r_rate,1) as r_rate --master data ,c_currency --master data - ,c_rate --master data + ,coalesce(c_rate,1) as c_rate --master data ,sum(coalesce(units,0)) units --history value ,sum(coalesce(value_loc,0)) value_loc --history value ,sum(coalesce(value_usd,0)) value_usd --0 @@ -55,7 +55,7 @@ target AS (select target_increment incr) where_clause -----------------additional params------------------- AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date + AND (order_date <= ship_date AND tag <> 'open-orders') GROUP BY fspr ,plnt ---master data @@ -98,29 +98,31 @@ target AS (select target_increment incr) ,ship_month ,ship_season ) +-- select * from basemix +-- ,scale AS ( SELECT - (SELECT incr::numeric FROM target) incr - ,(SELECT sum(value_loc * r_rate) FROM basemix) base - ,CASE WHEN (SELECT sum(value_loc * r_rate) FROM basemix) = 0 THEN - 0 - ELSE - (SELECT incr::numeric FROM target)/(SELECT sum(value_loc * r_rate) FROM basemix) + CASE + WHEN (SELECT coalesce(sum(value_loc),0) FROM basemix) = 0 AND (SELECT sum(units) FROM basemix) = 0 THEN 'both' + WHEN (SELECT coalesce(sum(value_loc),0) FROM basemix) = 0 THEN 'cost' + ELSE 'other' + END zero_values + ,CASE + WHEN (SELECT coalesce(sum(value_loc),0) FROM basemix) = 0 AND (SELECT coalesce(sum(units),0) FROM basemix) = 0 -- Split incr evenly between rows. + THEN (SELECT incr::numeric FROM target) / (SELECT count(*) FROM basemix) + WHEN (SELECT coalesce(sum(value_loc),0) FROM basemix) = 0 -- Get a per-unit incr value + THEN (SELECT incr::numeric FROM target) / (SELECT sum(units) FROM basemix) + ELSE -- Find percent change for existing value_loc + (SELECT incr::numeric FROM target) / (SELECT nullif(sum(value_loc * r_rate),0) FROM basemix) - 1 END factor - ,CASE WHEN (SELECT sum(value_loc * r_rate) FROM basemix) = 0 THEN - CASE WHEN ((SELECT incr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM basemix)) <> 0 THEN - --if the base value is -0- but the target value hasn't been achieved, derive a price to apply - ((SELECT incr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM basemix))/(SELECT sum(units) FROM basemix) - ELSE - 0 - END - ELSE - 0 - END mod_price ) +-- select * from scale +-- ,log AS ( INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * ) +-- select * from log +-- ,final AS ( SELECT fspr @@ -153,8 +155,16 @@ target AS (select target_increment incr) ,c_currency --master data ,c_rate --master data ,0::numeric units - ,round((CASE WHEN s.factor = 0 THEN b.units * s.mod_price/b.r_rate ELSE b.value_loc*s.factor END)::numeric,2) value_loc - ,round((CASE WHEN s.factor = 0 THEN b.units * s.mod_price ELSE b.value_usd*s.factor END)::numeric ,2) value_usd + ,round(CASE s.zero_values + WHEN 'both' THEN s.factor / b.r_rate + WHEN 'cost' THEN b.units * s.factor / b.r_rate + WHEN 'other' THEN b.value_loc * s.factor + END, 2) AS value_loc + ,round(CASE s.zero_values + WHEN 'both' THEN s.factor + WHEN 'cost' THEN b.units * s.factor + WHEN 'other' THEN b.value_usd * s.factor + END, 2) AS value_usd ,0::numeric cost_loc ,0::numeric cost_usd ,calc_status --0 @@ -180,9 +190,10 @@ target AS (select target_increment incr) CROSS JOIN scale s CROSS JOIN log WHERE - s.factor <> 0 or s.mod_price <> 0 + s.factor <> 0 ) ---select sum(value_usd), count(*) from final +-- select * from final +-- , ins AS ( INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING * ) diff --git a/route_sql/scale_vd.sql b/route_sql/scale_vd.sql index 6ef2ad9..63ebcd1 100644 --- a/route_sql/scale_vd.sql +++ b/route_sql/scale_vd.sql @@ -12,8 +12,10 @@ target AS (select incr_qty qincr) where_clause -----------------additional params------------------- AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date + AND ( order_date <= ship_date OR tag = 'open-orders') ) +-- select * from testv +-- ,flagv AS ( SELECT tot @@ -35,7 +37,8 @@ target AS (select incr_qty qincr) FROM testv ) ---ever need receive a target of -0- qty but value <> 0? +-- select * from flagv +-- ,basemix AS ( SELECT fspr @@ -64,9 +67,9 @@ target AS (select incr_qty qincr) ,substance ,fs_line --master data ,r_currency --history cust mix - ,r_rate --master data + ,coalesce(r_rate,1) as r_rate --master data ,c_currency --master data - ,c_rate --master data + ,coalesce(c_rate,1) as c_rate --master data ,sum(coalesce(units,0)) units --history value ,sum(coalesce(value_loc,0)) value_loc --history value ,sum(coalesce(value_usd,0)) value_usd --0 @@ -96,7 +99,7 @@ target AS (select incr_qty qincr) WHEN 'scale new part' THEN module = 'new basket' END AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date + AND (order_date <= ship_date AND tag <> 'open-orders') GROUP BY fspr ,plnt ---master data @@ -139,17 +142,33 @@ target AS (select incr_qty qincr) ,ship_month ,ship_season ) ---SELECT * FROM basemix +-- select * from basemix +-- ,scale AS ( SELECT (SELECT qincr::numeric FROM target) incr ,(SELECT sum(value_loc *r_rate) FROM basemix) base - ,(SELECT qincr FROM target)/(SELECT SUM(units) FROM basemix) factor + -- If sum(units) = 0, then we're likely working with a single row. We can't + -- scale 0, no matter how we try, so we just use mod_volume to set the value we want. + -- When sum(units) <> 0, then we use factor to scale units. + ,CASE + WHEN (SELECT sum(units)::numeric FROM basemix) = 0 + THEN 0 + ELSE (SELECT qincr::numeric FROM target)/(SELECT sum(units)::numeric FROM basemix) + END AS factor + ,CASE + WHEN (SELECT sum(units)::numeric FROM basemix) = 0 + THEN (SELECT qincr::numeric FROM target) + ELSE 0 + END AS mod_volume ) ---select * from scale +-- select * from scale +-- ,log AS ( INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * ) +-- select * from log +-- ,final AS ( SELECT fspr @@ -166,10 +185,10 @@ target AS (select incr_qty qincr) ,chan --master data ,chansub ,chan_retail - ,part + ,b.part ,part_descr ,part_group - ,branding + ,b.branding ,majg_descr ,ming_descr ,majs_descr @@ -181,11 +200,11 @@ target AS (select incr_qty qincr) ,r_rate --master data ,c_currency --master data ,c_rate --master data - ,round(units*s.factor ,2) units - ,round(value_loc*s.factor,2) value_loc - ,round(value_usd*s.factor,2) value_usd - ,round(cost_loc*s.factor ,2) cost_loc - ,round(cost_usd*s.factor ,2) cost_usd + ,round(CASE WHEN s.factor = 0 THEN s.mod_volume ELSE units*s.factor END, 2) units + ,round(value_loc*s.factor, 2) value_loc + ,round(value_usd*s.factor, 2) value_usd + ,round(cost_loc*s.factor, 2) cost_loc + ,round(cost_usd*s.factor, 2) cost_usd ,calc_status --0 ,flag --0 ,order_date --history date mix @@ -203,13 +222,19 @@ target AS (select incr_qty qincr) ,COALESCE(log.doc->>'tag','') "tag" ,log.doc->>'message' "comment" ,log.doc->>'type' module - ,round(pounds*s.factor, 2) pounds + ,round(CASE + WHEN s.factor = 0 THEN s.mod_volume * i.nwht * (CASE i.nwun + WHEN 'KG' THEN 2.2046 + ELSE 1 END) + ELSE pounds*s.factor END, 2) pounds FROM basemix b CROSS JOIN scale s CROSS JOIN log + LEFT OUTER JOIN "CMS.CUSLG".itemm i ON i.item = b.part ) ---select sum(value_usd), count(*) from final +-- select * from final +-- , ins AS ( INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING * ) diff --git a/route_sql/scale_vupd.sql b/route_sql/scale_vupd.sql index 14fa60f..6081eeb 100644 --- a/route_sql/scale_vupd.sql +++ b/route_sql/scale_vupd.sql @@ -12,9 +12,10 @@ target AS (select target_vol vincr, target_prc pincr) where_clause -----------------additional params------------------- AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date - + AND ( order_date <= ship_date OR tag = 'open-orders') ) +-- select * from testv +-- ,flagv AS ( SELECT tot @@ -36,6 +37,8 @@ target AS (select target_vol vincr, target_prc pincr) FROM testv ) +-- select * from flagv +-- ,basemix AS ( SELECT fspr @@ -64,9 +67,9 @@ target AS (select target_vol vincr, target_prc pincr) ,substance ,fs_line --master data ,r_currency --history cust mix - ,r_rate --master data + ,coalesce(r_rate,1) as r_rate --master data ,c_currency --master data - ,c_rate --master data + ,coalesce(c_rate,1) as c_rate --master data ,sum(coalesce(units,0)) units --history value ,sum(coalesce(value_loc,0)) value_loc --history value ,sum(coalesce(value_usd,0)) value_usd --0 @@ -96,7 +99,7 @@ target AS (select target_vol vincr, target_prc pincr) WHEN 'scale new part' THEN module = 'new basket' END AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments - AND order_date <= ship_date + AND (order_date <= ship_date AND tag <> 'open-orders') GROUP BY fspr ,plnt ---master data @@ -139,13 +142,28 @@ target AS (select target_vol vincr, target_prc pincr) ,ship_month ,ship_season ) +-- select * from basemix +-- ,vscale AS ( SELECT (SELECT vincr::numeric FROM target) incr ,(SELECT sum(units)::numeric FROM basemix) base - ,(SELECT vincr::numeric FROM target)/(SELECT sum(units)::numeric FROM basemix) factor + -- If sum(units) = 0, then we're likely working with a single row. We can't + -- scale 0, no matter how we try, so we just use mod_volume to set the value we want. + -- When sum(units) <> 0, then we use factor to scale units. + ,CASE + WHEN (SELECT sum(units)::numeric FROM basemix) = 0 + THEN 0 + ELSE (SELECT vincr::numeric FROM target)/(SELECT sum(units)::numeric FROM basemix) + END AS factor + ,CASE + WHEN (SELECT sum(units)::numeric FROM basemix) = 0 + THEN (SELECT vincr::numeric FROM target) + ELSE 0 + END AS mod_volume ) ---select * from vscale +-- select * from vscale +-- ,log AS ( INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * ) @@ -165,10 +183,10 @@ target AS (select target_vol vincr, target_prc pincr) ,chan --master data ,chansub ,chan_retail - ,part + ,b.part ,part_descr ,part_group - ,branding + ,b.branding ,majg_descr ,ming_descr ,majs_descr @@ -180,11 +198,11 @@ target AS (select target_vol vincr, target_prc pincr) ,r_rate --master data ,c_currency --master data ,c_rate --master data - ,round(units*s.factor ,2) units - ,round(value_loc*s.factor,2) value_loc - ,round(value_usd*s.factor,2) value_usd - ,round(cost_loc*s.factor ,2) cost_loc - ,round(cost_usd*s.factor ,2) cost_usd + ,round(CASE WHEN s.factor = 0 THEN s.mod_volume ELSE units*s.factor END, 2) units + ,round(value_loc*s.factor, 2) value_loc + ,round(value_usd*s.factor, 2) value_usd + ,round(cost_loc*s.factor, 2) cost_loc + ,round(cost_usd*s.factor, 2) cost_usd ,calc_status --0 ,flag --0 ,order_date --history date mix @@ -202,35 +220,37 @@ target AS (select target_vol vincr, target_prc pincr) ,COALESCE(log.doc->>'tag','') "tag" ,log.doc->>'message' "comment" ,log.doc->>'type' module - ,round(pounds*s.factor, 2) pounds + ,round(CASE + WHEN s.factor = 0 THEN s.mod_volume * i.nwht * (CASE i.nwun + WHEN 'KG' THEN 2.2046 + ELSE 1 END) + ELSE pounds*s.factor END, 2) pounds FROM basemix b CROSS JOIN vscale s CROSS JOIN log + LEFT OUTER JOIN "CMS.CUSLG".itemm i ON i.item = b.part ) +-- select * from volume +-- ,pscale AS ( SELECT - (SELECT pincr::numeric FROM target) incr - ,(SELECT sum(value_loc * r_rate) FROM volume) base - ,CASE WHEN (SELECT sum(value_loc * r_rate) FROM volume) = 0 THEN - --if the base value is -0- scaling will not work, need to generate price, factor goes to -0- - 0 - ELSE - --if the target $amount is not achieved, adjust further - ((SELECT pincr::numeric FROM target)-(SELECT sum(value_loc * r_rate) FROM volume))/(SELECT sum(value_loc * r_rate) FROM volume) + CASE + WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 AND (SELECT sum(units) FROM volume) = 0 THEN 'both' + WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 THEN 'cost' + ELSE 'other' + END zero_values + ,CASE + WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 AND (SELECT coalesce(sum(units),0) FROM volume) = 0 -- Split pincr evenly between rows. + THEN (SELECT pincr::numeric FROM target) / (SELECT count(*) FROM volume) + WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 -- Get a per-unit pincr value + THEN (SELECT pincr::numeric FROM target) / (SELECT sum(units) FROM volume) + ELSE -- Find percent change for existing value_loc + (SELECT pincr::numeric FROM target) / (SELECT nullif(sum(value_loc * r_rate),0) FROM volume) - 1 END factor - ,CASE WHEN (SELECT sum(value_loc * r_rate) FROM volume) = 0 THEN - CASE WHEN ((SELECT pincr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM volume)) <> 0 THEN - --if the base value is -0- but the target value hasn't been achieved, derive a price to apply - ((SELECT pincr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM volume))/(SELECT sum(units) FROM volume) - ELSE - 0 - END - ELSE - 0 - END mod_price ) ---select * from pscale +-- select * from pscale +-- ,pricing AS ( SELECT fspr @@ -263,8 +283,16 @@ FROM ,c_currency --master data ,c_rate --master data ,0::numeric units - ,round((CASE WHEN s.factor = 0 THEN b.units * s.mod_price/b.r_rate ELSE b.value_loc*s.factor END)::numeric,2) value_loc - ,round((CASE WHEN s.factor = 0 THEN b.units * s.mod_price ELSE b.value_usd*s.factor END)::numeric ,2) value_usd + ,round(CASE s.zero_values + WHEN 'both' THEN s.factor / b.r_rate + WHEN 'cost' THEN b.units * s.factor / b.r_rate + WHEN 'other' THEN b.value_loc * s.factor + END, 2) AS value_loc + ,round(CASE s.zero_values + WHEN 'both' THEN s.factor + WHEN 'cost' THEN b.units * s.factor + WHEN 'other' THEN b.value_usd * s.factor + END, 2) AS value_usd ,0::numeric cost_loc ,0::numeric cost_usd ,calc_status --0 @@ -290,9 +318,10 @@ FROM CROSS JOIN pscale s CROSS JOIN log WHERE - s.factor <> 0 or s.mod_price <> 0 + s.factor <> 0 ) ---select sum(value_usd), sum(units) from pricing +-- SELECT * FROM pricing UNION ALL SELECT * FROM volume +-- , ins AS ( INSERT INTO rlarp.osm_pool (SELECT * FROM pricing UNION ALL SELECT * FROM volume) RETURNING * ) @@ -379,4 +408,6 @@ FROM ,tag ,comment ) +-- select * from insagg +-- SELECT json_agg(row_to_json(insagg)) x from insagg