51 lines
1.7 KiB
Transact-SQL
51 lines
1.7 KiB
Transact-SQL
-- =============================================================================
|
|
-- Пересчёт roic_norm по методике (возврат денег по ходу продаж)
|
|
-- Таблицы: manufacturers, manufacturer_payment_stage
|
|
-- Алгоритм: avgReturnDay = logistics_days + days_of_sales/2
|
|
-- frozenDays = avgReturnDay - effectiveDeferralDays
|
|
-- roic_norm = 12 / (frozenDays/30) * 100
|
|
-- =============================================================================
|
|
|
|
USE [mag_pbi]
|
|
GO
|
|
|
|
;WITH stage_agg AS (
|
|
SELECT
|
|
manufacturer_id,
|
|
SUM([percent] / 100.0 * [days]) AS effective_deferral_days,
|
|
SUM([percent] / 100.0) AS total_percent
|
|
FROM [analytics].[manufacturer_payment_stage]
|
|
GROUP BY manufacturer_id
|
|
),
|
|
calc AS (
|
|
SELECT
|
|
man.id,
|
|
man.days_of_sales,
|
|
man.logistics_days,
|
|
COALESCE(s.effective_deferral_days, 0) AS effective_deferral_days,
|
|
COALESCE(s.total_percent, 0) AS total_percent,
|
|
(man.logistics_days + man.days_of_sales / 2.0) AS avg_return_day
|
|
FROM [analytics].[manufacturers] man
|
|
LEFT JOIN stage_agg s ON s.manufacturer_id = man.id
|
|
),
|
|
roic_calc AS (
|
|
SELECT
|
|
id,
|
|
CASE
|
|
WHEN total_percent <= 0 THEN NULL
|
|
WHEN (avg_return_day - effective_deferral_days) <= 0 THEN NULL
|
|
ELSE ROUND(12.0 / ((avg_return_day - effective_deferral_days) / 30.0) * 100.0, 2)
|
|
END AS new_roic
|
|
FROM calc
|
|
)
|
|
UPDATE man
|
|
SET man.roic_norm = r.new_roic
|
|
FROM [analytics].[manufacturers] man
|
|
JOIN roic_calc r ON r.id = man.id;
|
|
|
|
SELECT
|
|
COUNT(*) AS total,
|
|
COUNT(roic_norm) AS with_roic,
|
|
COUNT(*) - COUNT(roic_norm) AS without_roic
|
|
FROM [analytics].[manufacturers];
|