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'
This commit is contained in:
PhilRunninger 2023-05-17 05:28:21 -04:00
parent 7e82b37fb1
commit 47d1baffc5
5 changed files with 278 additions and 148 deletions

View File

@ -8,8 +8,8 @@ target AS (select target_volume vincr, target_price pincr)
sum(units) tot sum(units) tot
,sum(units) FILTER (WHERE iter IN ('copy','plan','diff')) base ,sum(units) FILTER (WHERE iter IN ('copy','plan','diff')) base
,COALESCE(sum(units) FILTER (WHERE module = 'new basket'),0) newpart ,COALESCE(sum(units) FILTER (WHERE module = 'new basket'),0) newpart
,sum(value_loc *r_rate) totsales ,coalesce(sum(value_loc *r_rate),0) totsales
,sum(value_loc *r_rate) FILTER (WHERE iter IN ('plan','diff','copy')) basesales ,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 ,COALESCE(sum(value_loc *r_rate) FILTER (WHERE module = 'new basket'),0) newpartsales
FROM FROM
rlarp.osm_pool rlarp.osm_pool
@ -18,8 +18,10 @@ target AS (select target_volume vincr, target_price pincr)
where_clause where_clause
-----------------additional params------------------- -----------------additional params-------------------
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 ( ,flagv AS (
SELECT SELECT
tot tot
@ -54,6 +56,8 @@ target AS (select target_volume vincr, target_price pincr)
FROM FROM
testv testv
) )
-- select * from flagv
--
,GLD AS MATERIALIZED ( ,GLD AS MATERIALIZED (
SELECT SELECT
N1COMP COMP N1COMP COMP
@ -76,6 +80,8 @@ target AS (select target_volume vincr, target_price pincr)
WHERE WHERE
N1COMP = 93 N1COMP = 93
) )
-- select * from gld
--
,mseq AS ( ,mseq AS (
SELECT * FROM SELECT * FROM
( (
@ -94,6 +100,8 @@ target AS (select target_volume vincr, target_price pincr)
,('12 - May',12,5,0) ,('12 - May',12,5,0)
) x(m,s,cal,yr) ) x(m,s,cal,yr)
) )
-- select * from mseq
--
,alldates AS MATERIALIZED( ,alldates AS MATERIALIZED(
SELECT SELECT
promo promo
@ -118,7 +126,7 @@ target AS (select target_volume vincr, target_price pincr)
WHEN 'scale new part' THEN module = 'new basket' WHEN 'scale new part' THEN module = 'new basket'
END END
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 GROUP BY
promo promo
,terms ,terms
@ -127,10 +135,11 @@ target AS (select target_volume vincr, target_price pincr)
,order_date ,order_date
,request_date ,request_date
,ship_date ,ship_date
HAVING -- HAVING
sum(CASE (SELECT flagsales FROM flagv) WHEN 'no price'THEN 1.0 ELSE value_usd END) <> 0 -- 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 ( ,dom AS (
SELECT SELECT
extract(day FROM order_date) DOM extract(day FROM order_date) DOM
@ -140,6 +149,8 @@ target AS (select target_volume vincr, target_price pincr)
GROUP BY GROUP BY
extract(day FROM order_date) 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)--------------- ---------------------may want ot look at a top-5 mix solution in the future facilitated by sum() over (order by sales desc)---------------
,mmix AS ( ,mmix AS (
SELECT SELECT
@ -151,18 +162,19 @@ target AS (select target_volume vincr, target_price pincr)
,sum((request_date-order_date)*(value_usd)) rlag_wa ,sum((request_date-order_date)*(value_usd)) rlag_wa
--,ship_date - request_date slag --,ship_date - request_date slag
,sum((ship_date - request_date)*(value_usd)) slag_wa ,sum((ship_date - request_date)*(value_usd)) slag_wa
,sum(value_usd) value_usd ,coalesce(nullif(sum(value_usd),0),1) value_usd
FROM FROM
alldates alldates
GROUP BY GROUP BY
to_char(order_date,'Mon') to_char(order_date,'Mon')
,seq ,seq
,promo ,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 ( ,mmixp AS (
SELECT SELECT
_month _month
@ -172,10 +184,11 @@ target AS (select target_volume vincr, target_price pincr)
,round((rlag_wa/value_usd)::numeric,0)::int rlag ,round((rlag_wa/value_usd)::numeric,0)::int rlag
,round((slag_wa/value_usd)::numeric,0)::int slag ,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) momix
--,value_usd/SUM(value_usd) over (PARTITION BY _month) vperc
FROM FROM
mmix mmix
) )
-- select * from mmixp
--
,closest AS ( ,closest AS (
SELECT SELECT
_month, targm.s, m _month, targm.s, m
@ -186,6 +199,8 @@ target AS (select target_volume vincr, target_price pincr)
abs(seq - targm.s) ASC abs(seq - targm.s) ASC
LIMIT 1 LIMIT 1
) )
-- select * from closest
--
---------------------the role of basemix here is to get non-dated info which is then dated in the next step--------------------- ---------------------the role of basemix here is to get non-dated info which is then dated in the next step---------------------
,basemix AS ( ,basemix AS (
SELECT SELECT
@ -241,7 +256,7 @@ SELECT
WHEN 'scale new part' THEN module = 'new basket' WHEN 'scale new part' THEN module = 'new basket'
END END
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 GROUP BY
--fspr in next step --fspr in next step
o.plnt o.plnt
@ -276,16 +291,33 @@ SELECT
,o.calc_status ,o.calc_status
,o.flag ,o.flag
) )
-- select * from basemix
--
,vscale AS ( ,vscale AS (
SELECT SELECT
(SELECT vincr::numeric FROM target) incr (SELECT vincr::numeric FROM target) incr
,(SELECT sum(units) FROM basemix) base ,(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 ( ,log AS (
INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING *
) )
-- select * from log
--
,volume AS ( ,volume AS (
SELECT SELECT
sd.fspr sd.fspr
@ -317,7 +349,7 @@ SELECT
,b.r_rate ,b.r_rate
,b.c_currency ,b.c_currency
,b.c_rate ,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_loc*s.factor*m.momix,2) value_loc
,round(b.value_usd*s.factor*m.momix,2) value_usd ,round(b.value_usd*s.factor*m.momix,2) value_usd
,round(b.cost_loc*s.factor*m.momix ,2) cost_loc ,round(b.cost_loc*s.factor*m.momix ,2) cost_loc
@ -339,7 +371,11 @@ SELECT
,COALESCE(log.doc->>'tag','') "tag" ,COALESCE(log.doc->>'tag','') "tag"
,log.doc->>'message' "comment" ,log.doc->>'message' "comment"
,log.doc->>'type' module ,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 FROM
basemix b basemix b
CROSS JOIN vscale s 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 make_date(mseq.yr + 2024,mseq.cal,m.odom) + rlag BETWEEN rd.sdat AND rd.edat
LEFT OUTER JOIN gld sd ON LEFT OUTER JOIN gld sd ON
make_date(mseq.yr + 2024,mseq.cal,m.odom) + rlag + slag BETWEEN sd.sdat AND sd.edat 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 WHERE
m._month = (SELECT _month FROM closest) m._month = (SELECT _month FROM closest)
) )
-- select * from volume
--
,pscale AS ( ,pscale AS (
SELECT SELECT
(SELECT pincr::numeric FROM target) incr CASE
,(SELECT sum(value_loc * r_rate) FROM volume) base WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 AND (SELECT sum(units) FROM volume) = 0 THEN 'both'
,CASE WHEN (SELECT sum(value_loc * r_rate) FROM volume) = 0 THEN WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 THEN 'cost'
0 ELSE 'other'
ELSE END zero_values
((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 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 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 ( ,price AS (
SELECT SELECT
b.fspr b.fspr
@ -409,8 +446,16 @@ SELECT
,b.c_currency ,b.c_currency
,b.c_rate ,b.c_rate
,0::numeric units ,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 p.zero_values
,round((CASE WHEN p.factor = 0 THEN b.units * p.mod_price ELSE b.value_usd*p.factor END)::numeric ,2) value_usd 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_loc
,0::numeric cost_usd ,0::numeric cost_usd
,b.calc_status ,b.calc_status
@ -436,8 +481,10 @@ FROM
CROSS JOIN pscale p CROSS JOIN pscale p
CROSS JOIN log CROSS JOIN log
WHERE WHERE
p.factor <> 0 or p.mod_price <> 0 p.factor <> 0
) )
-- SELECT * FROM price UNION ALL SELECT * FROM volume
--
, ins AS ( , ins AS (
INSERT INTO rlarp.osm_pool (SELECT * FROM price UNION ALL SELECT * FROM volume) RETURNING * INSERT INTO rlarp.osm_pool (SELECT * FROM price UNION ALL SELECT * FROM volume) RETURNING *
) )

View File

@ -1,10 +1,10 @@
-- Connection: usmidsap01.ubm
WITH WITH
/* /*
the volume must be expressed in terms of units, since that is what it will be scaling the volume must be expressed in terms of units, since that is what it will be scaling
*/ */
target AS (select $$replace_request$$::json def) target AS (select $$replace_request$$::json def)
--select * from newm -- select * from target
--
,GLD AS ( ,GLD AS (
SELECT SELECT
N1COMP COMP N1COMP COMP
@ -29,6 +29,8 @@ target AS (select $$replace_request$$::json def)
N1COMP = 93 N1COMP = 93
--AND DIGITS(N1FSYP) = '1901' --AND DIGITS(N1FSYP) = '1901'
) )
-- select * from GLD
--
,mseq AS ( ,mseq AS (
SELECT * FROM SELECT * FROM
( (
@ -47,6 +49,8 @@ target AS (select $$replace_request$$::json def)
,('12 - May',12,5,0) ,('12 - May',12,5,0)
) x(m,s,cal,yr) ) x(m,s,cal,yr)
) )
-- select * from mseq
--
,seg AS ( ,seg AS (
SELECT SELECT
x.GLEC glec x.GLEC glec
@ -71,6 +75,8 @@ target AS (select $$replace_request$$::json def)
('9TO','Other') ('9TO','Other')
) X(GLEC, SEGM) ) X(GLEC, SEGM)
) )
-- select * from seg
--
,copr AS ( ,copr AS (
SELECT SELECT
LTRIM(RTRIM(A9)) AS COMP, LTRIM(RTRIM(A9)) AS COMP,
@ -91,6 +97,8 @@ target AS (select $$replace_request$$::json def)
WHERE WHERE
A2 = 'AA' OR A2 IS NULL A2 = 'AA' OR A2 IS NULL
) )
-- select * from copr
--
,alldates AS ( ,alldates AS (
SELECT SELECT
promo 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 --probably dont want to include adjustments that have blown away volume and good sources of dating info
-----------------additional params------------------- -----------------additional params-------------------
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 GROUP BY
promo promo
,terms ,terms
@ -122,10 +130,11 @@ target AS (select $$replace_request$$::json def)
,order_date ,order_date
,request_date ,request_date
,ship_date ,ship_date
HAVING -- HAVING
sum(value_usd) <> 0 -- sum(value_usd) <> 0
) )
--select * from alldates -- select * from alldates
--
,dom AS ( ,dom AS (
SELECT SELECT
extract(day FROM order_date) DOM extract(day FROM order_date) DOM
@ -135,8 +144,8 @@ target AS (select $$replace_request$$::json def)
GROUP BY GROUP BY
extract(day FROM order_date) extract(day FROM order_date)
) )
--select * from dom -- 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 ( ,mmix AS (
SELECT SELECT
to_char(order_date,'Mon') _month 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 ,sum((request_date-order_date)*(value_usd)) rlag_wa
--,ship_date - request_date slag --,ship_date - request_date slag
,sum((ship_date - request_date)*(value_usd)) slag_wa ,sum((ship_date - request_date)*(value_usd)) slag_wa
,sum(value_usd) value_usd ,COALESCE(nullif(sum(value_usd),0),1) value_usd
FROM FROM
alldates alldates
GROUP BY GROUP BY
@ -162,7 +171,8 @@ target AS (select $$replace_request$$::json def)
--,request_date-order_date --,request_date-order_date
--,ship_date - request_date --,ship_date - request_date
) )
--select * from mmix -- select * from mmix
--
,targm AS ( ,targm AS (
SELECT SELECT
je.key as month je.key as month
@ -179,6 +189,7 @@ target AS (select $$replace_request$$::json def)
mseq.m = je.key mseq.m = je.key
) )
--select * from targm --select * from targm
--
,mmixp AS ( ,mmixp AS (
SELECT SELECT
_month _month
@ -195,7 +206,7 @@ target AS (select $$replace_request$$::json def)
mmix mmix
) )
--select * from mmixp --select * from mmixp
--month cross join mix --
,mxm AS ( ,mxm AS (
SELECT SELECT
t.month t.month
@ -224,8 +235,8 @@ FROM
LIMIT 1 LIMIT 1
) )
) )
--SELECT * FROM mxm -- 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 --
,basemix AS ( ,basemix AS (
SELECT SELECT
sd.fspr sd.fspr
@ -261,10 +272,13 @@ SELECT
LEFT OUTER JOIN gld sd ON LEFT OUTER JOIN gld sd ON
sd.drange @> (make_date(mxm.yr + 2024,mxm.cal,mxm.odom) + rlag + slag) sd.drange @> (make_date(mxm.yr + 2024,mxm.cal,mxm.odom) + rlag + slag)
) )
--SELECT * FROM basemix -- SELECT * FROM basemix
--
,log AS ( ,log AS (
INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING *
) )
-- select * from log
--
,final AS ( ,final AS (
SELECT SELECT
b.fspr b.fspr
@ -390,6 +404,8 @@ FROM
AND rx.fcur = COALESCE(bc.bvcurr,b.r_currency) AND rx.fcur = COALESCE(bc.bvcurr,b.r_currency)
AND rx.tcur = 'US' AND rx.tcur = 'US'
) )
-- select * from final
--
, ins AS ( , ins AS (
INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING * INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING *
) )

View File

@ -28,9 +28,9 @@ target AS (select target_increment incr)
,substance ,substance
,fs_line --master data ,fs_line --master data
,r_currency --history cust mix ,r_currency --history cust mix
,r_rate --master data ,coalesce(r_rate,1) as r_rate --master data
,c_currency --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(units,0)) units --history value
,sum(coalesce(value_loc,0)) value_loc --history value ,sum(coalesce(value_loc,0)) value_loc --history value
,sum(coalesce(value_usd,0)) value_usd --0 ,sum(coalesce(value_usd,0)) value_usd --0
@ -55,7 +55,7 @@ target AS (select target_increment incr)
where_clause where_clause
-----------------additional params------------------- -----------------additional params-------------------
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 GROUP BY
fspr fspr
,plnt ---master data ,plnt ---master data
@ -98,29 +98,31 @@ target AS (select target_increment incr)
,ship_month ,ship_month
,ship_season ,ship_season
) )
-- select * from basemix
--
,scale AS ( ,scale AS (
SELECT SELECT
(SELECT incr::numeric FROM target) incr CASE
,(SELECT sum(value_loc * r_rate) FROM basemix) base WHEN (SELECT coalesce(sum(value_loc),0) FROM basemix) = 0 AND (SELECT sum(units) FROM basemix) = 0 THEN 'both'
,CASE WHEN (SELECT sum(value_loc * r_rate) FROM basemix) = 0 THEN WHEN (SELECT coalesce(sum(value_loc),0) FROM basemix) = 0 THEN 'cost'
0 ELSE 'other'
ELSE END zero_values
(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 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 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 ( ,log AS (
INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING *
) )
-- select * from log
--
,final AS ( ,final AS (
SELECT SELECT
fspr fspr
@ -153,8 +155,16 @@ target AS (select target_increment incr)
,c_currency --master data ,c_currency --master data
,c_rate --master data ,c_rate --master data
,0::numeric units ,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 s.zero_values
,round((CASE WHEN s.factor = 0 THEN b.units * s.mod_price ELSE b.value_usd*s.factor END)::numeric ,2) value_usd 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_loc
,0::numeric cost_usd ,0::numeric cost_usd
,calc_status --0 ,calc_status --0
@ -180,9 +190,10 @@ target AS (select target_increment incr)
CROSS JOIN scale s CROSS JOIN scale s
CROSS JOIN log CROSS JOIN log
WHERE WHERE
s.factor <> 0 or s.mod_price <> 0 s.factor <> 0
) )
--select sum(value_usd), count(*) from final -- select * from final
--
, ins AS ( , ins AS (
INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING * INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING *
) )

View File

@ -12,8 +12,10 @@ target AS (select incr_qty qincr)
where_clause where_clause
-----------------additional params------------------- -----------------additional params-------------------
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 ( ,flagv AS (
SELECT SELECT
tot tot
@ -35,7 +37,8 @@ target AS (select incr_qty qincr)
FROM FROM
testv testv
) )
--ever need receive a target of -0- qty but value <> 0? -- select * from flagv
--
,basemix AS ( ,basemix AS (
SELECT SELECT
fspr fspr
@ -64,9 +67,9 @@ target AS (select incr_qty qincr)
,substance ,substance
,fs_line --master data ,fs_line --master data
,r_currency --history cust mix ,r_currency --history cust mix
,r_rate --master data ,coalesce(r_rate,1) as r_rate --master data
,c_currency --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(units,0)) units --history value
,sum(coalesce(value_loc,0)) value_loc --history value ,sum(coalesce(value_loc,0)) value_loc --history value
,sum(coalesce(value_usd,0)) value_usd --0 ,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' WHEN 'scale new part' THEN module = 'new basket'
END END
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 GROUP BY
fspr fspr
,plnt ---master data ,plnt ---master data
@ -139,17 +142,33 @@ target AS (select incr_qty qincr)
,ship_month ,ship_month
,ship_season ,ship_season
) )
--SELECT * FROM basemix -- select * from basemix
--
,scale AS ( ,scale AS (
SELECT SELECT
(SELECT qincr::numeric FROM target) incr (SELECT qincr::numeric FROM target) incr
,(SELECT sum(value_loc *r_rate) FROM basemix) base ,(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 ( ,log AS (
INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING *
) )
-- select * from log
--
,final AS ( ,final AS (
SELECT SELECT
fspr fspr
@ -166,10 +185,10 @@ target AS (select incr_qty qincr)
,chan --master data ,chan --master data
,chansub ,chansub
,chan_retail ,chan_retail
,part ,b.part
,part_descr ,part_descr
,part_group ,part_group
,branding ,b.branding
,majg_descr ,majg_descr
,ming_descr ,ming_descr
,majs_descr ,majs_descr
@ -181,11 +200,11 @@ target AS (select incr_qty qincr)
,r_rate --master data ,r_rate --master data
,c_currency --master data ,c_currency --master data
,c_rate --master data ,c_rate --master data
,round(units*s.factor ,2) units ,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_loc*s.factor, 2) value_loc
,round(value_usd*s.factor,2) value_usd ,round(value_usd*s.factor, 2) value_usd
,round(cost_loc*s.factor ,2) cost_loc ,round(cost_loc*s.factor, 2) cost_loc
,round(cost_usd*s.factor ,2) cost_usd ,round(cost_usd*s.factor, 2) cost_usd
,calc_status --0 ,calc_status --0
,flag --0 ,flag --0
,order_date --history date mix ,order_date --history date mix
@ -203,13 +222,19 @@ target AS (select incr_qty qincr)
,COALESCE(log.doc->>'tag','') "tag" ,COALESCE(log.doc->>'tag','') "tag"
,log.doc->>'message' "comment" ,log.doc->>'message' "comment"
,log.doc->>'type' module ,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 FROM
basemix b basemix b
CROSS JOIN scale s CROSS JOIN scale s
CROSS JOIN log 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 ( , ins AS (
INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING * INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING *
) )

View File

@ -12,9 +12,10 @@ target AS (select target_vol vincr, target_prc pincr)
where_clause where_clause
-----------------additional params------------------- -----------------additional params-------------------
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 ( ,flagv AS (
SELECT SELECT
tot tot
@ -36,6 +37,8 @@ target AS (select target_vol vincr, target_prc pincr)
FROM FROM
testv testv
) )
-- select * from flagv
--
,basemix AS ( ,basemix AS (
SELECT SELECT
fspr fspr
@ -64,9 +67,9 @@ target AS (select target_vol vincr, target_prc pincr)
,substance ,substance
,fs_line --master data ,fs_line --master data
,r_currency --history cust mix ,r_currency --history cust mix
,r_rate --master data ,coalesce(r_rate,1) as r_rate --master data
,c_currency --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(units,0)) units --history value
,sum(coalesce(value_loc,0)) value_loc --history value ,sum(coalesce(value_loc,0)) value_loc --history value
,sum(coalesce(value_usd,0)) value_usd --0 ,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' WHEN 'scale new part' THEN module = 'new basket'
END END
AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments 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 GROUP BY
fspr fspr
,plnt ---master data ,plnt ---master data
@ -139,13 +142,28 @@ target AS (select target_vol vincr, target_prc pincr)
,ship_month ,ship_month
,ship_season ,ship_season
) )
-- select * from basemix
--
,vscale AS ( ,vscale AS (
SELECT SELECT
(SELECT vincr::numeric FROM target) incr (SELECT vincr::numeric FROM target) incr
,(SELECT sum(units)::numeric FROM basemix) base ,(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 ( ,log AS (
INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING * 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 ,chan --master data
,chansub ,chansub
,chan_retail ,chan_retail
,part ,b.part
,part_descr ,part_descr
,part_group ,part_group
,branding ,b.branding
,majg_descr ,majg_descr
,ming_descr ,ming_descr
,majs_descr ,majs_descr
@ -180,11 +198,11 @@ target AS (select target_vol vincr, target_prc pincr)
,r_rate --master data ,r_rate --master data
,c_currency --master data ,c_currency --master data
,c_rate --master data ,c_rate --master data
,round(units*s.factor ,2) units ,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_loc*s.factor, 2) value_loc
,round(value_usd*s.factor,2) value_usd ,round(value_usd*s.factor, 2) value_usd
,round(cost_loc*s.factor ,2) cost_loc ,round(cost_loc*s.factor, 2) cost_loc
,round(cost_usd*s.factor ,2) cost_usd ,round(cost_usd*s.factor, 2) cost_usd
,calc_status --0 ,calc_status --0
,flag --0 ,flag --0
,order_date --history date mix ,order_date --history date mix
@ -202,35 +220,37 @@ target AS (select target_vol vincr, target_prc pincr)
,COALESCE(log.doc->>'tag','') "tag" ,COALESCE(log.doc->>'tag','') "tag"
,log.doc->>'message' "comment" ,log.doc->>'message' "comment"
,log.doc->>'type' module ,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 FROM
basemix b basemix b
CROSS JOIN vscale s CROSS JOIN vscale s
CROSS JOIN log CROSS JOIN log
LEFT OUTER JOIN "CMS.CUSLG".itemm i ON i.item = b.part
) )
-- select * from volume
--
,pscale AS ( ,pscale AS (
SELECT SELECT
(SELECT pincr::numeric FROM target) incr CASE
,(SELECT sum(value_loc * r_rate) FROM volume) base WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 AND (SELECT sum(units) FROM volume) = 0 THEN 'both'
,CASE WHEN (SELECT sum(value_loc * r_rate) FROM volume) = 0 THEN WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 THEN 'cost'
--if the base value is -0- scaling will not work, need to generate price, factor goes to -0- ELSE 'other'
0 END zero_values
ELSE ,CASE
--if the target $amount is not achieved, adjust further WHEN (SELECT coalesce(sum(value_loc),0) FROM volume) = 0 AND (SELECT coalesce(sum(units),0) FROM volume) = 0 -- Split pincr evenly between rows.
((SELECT pincr::numeric FROM target)-(SELECT sum(value_loc * r_rate) FROM volume))/(SELECT sum(value_loc * r_rate) FROM volume) 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 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 ( ,pricing AS (
SELECT SELECT
fspr fspr
@ -263,8 +283,16 @@ FROM
,c_currency --master data ,c_currency --master data
,c_rate --master data ,c_rate --master data
,0::numeric units ,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 s.zero_values
,round((CASE WHEN s.factor = 0 THEN b.units * s.mod_price ELSE b.value_usd*s.factor END)::numeric ,2) value_usd 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_loc
,0::numeric cost_usd ,0::numeric cost_usd
,calc_status --0 ,calc_status --0
@ -290,9 +318,10 @@ FROM
CROSS JOIN pscale s CROSS JOIN pscale s
CROSS JOIN log CROSS JOIN log
WHERE 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 ( , ins AS (
INSERT INTO rlarp.osm_pool (SELECT * FROM pricing UNION ALL SELECT * FROM volume) RETURNING * INSERT INTO rlarp.osm_pool (SELECT * FROM pricing UNION ALL SELECT * FROM volume) RETURNING *
) )
@ -379,4 +408,6 @@ FROM
,tag ,tag
,comment ,comment
) )
-- select * from insagg
--
SELECT json_agg(row_to_json(insagg)) x from insagg SELECT json_agg(row_to_json(insagg)) x from insagg