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) 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 *
)

View File

@ -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 *
)

View File

@ -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 *
)

View File

@ -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 *
)

View File

@ -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