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:
parent
7e82b37fb1
commit
47d1baffc5
@ -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,6 +56,8 @@ target AS (select target_volume vincr, target_price pincr)
|
||||
FROM
|
||||
testv
|
||||
)
|
||||
-- select * from flagv
|
||||
--
|
||||
,GLD AS MATERIALIZED (
|
||||
SELECT
|
||||
N1COMP COMP
|
||||
@ -76,6 +80,8 @@ target AS (select target_volume vincr, target_price pincr)
|
||||
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
|
||||
--
|
||||
,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 *
|
||||
)
|
||||
|
||||
@ -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
|
||||
--
|
||||
,dom AS (
|
||||
SELECT
|
||||
extract(day FROM order_date) DOM
|
||||
@ -136,7 +145,7 @@ target AS (select $$replace_request$$::json def)
|
||||
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
|
||||
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
|
||||
@ -163,6 +172,7 @@ target AS (select $$replace_request$$::json def)
|
||||
--,ship_date - request_date
|
||||
)
|
||||
-- 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
|
||||
@ -225,7 +236,7 @@ FROM
|
||||
)
|
||||
)
|
||||
-- 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 (
|
||||
SELECT
|
||||
sd.fspr
|
||||
@ -262,9 +273,12 @@ SELECT
|
||||
sd.drange @> (make_date(mxm.yr + 2024,mxm.cal,mxm.odom) + rlag + slag)
|
||||
)
|
||||
-- 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 *
|
||||
)
|
||||
|
||||
@ -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 *
|
||||
)
|
||||
|
||||
@ -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
|
||||
--
|
||||
,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,7 +200,7 @@ 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(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
|
||||
@ -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 *
|
||||
)
|
||||
|
||||
@ -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
|
||||
--
|
||||
,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,7 +198,7 @@ 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(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
|
||||
@ -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
|
||||
--
|
||||
,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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user