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