Files
SBrainCO/db/etl_store_target.sql

68 lines
3.0 KiB
SQL

-- ============================================================
-- 门店月度目标表 ETL
-- 基于历史实际收入自动生成基准目标
-- 策略:用最近完整月份的实际收入作为下月目标基准,按区域增长率微调
-- ============================================================
-- 1. 创建目标表(如果不存在)
CREATE TABLE IF NOT EXISTS analytics.dim_store_target (
id SERIAL PRIMARY KEY,
store_code VARCHAR(20) NOT NULL,
target_month DATE NOT NULL,
revenue_target NUMERIC(12,2) NOT NULL,
bill_count_target INTEGER,
avg_bill_value_target NUMERIC(8,2),
member_penetration_target NUMERIC(5,2), -- 百分比
cost_rate_target NUMERIC(5,2), -- 百分比
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
UNIQUE(store_code, target_month)
);
-- 2. 生成2026-05目标(基于4月实际 × 增长系数1.03)
INSERT INTO analytics.dim_store_target (store_code, target_month, revenue_target, bill_count_target, avg_bill_value_target, member_penetration_target, cost_rate_target)
SELECT
r.store_code,
'2026-05-01'::date,
round(r.received * 1.03, 2) as revenue_target,
round(r.bill_count * 1.03) as bill_count_target,
round(r.avg_bill_value, 2) as avg_bill_value_target,
round(r.member_bill_share_pct, 2) as member_penetration_target,
30.00 as cost_rate_target
FROM analytics.mv_store_risk_rating_monthly r
WHERE r.month_start = '2026-04-01'
ON CONFLICT (store_code, target_month) DO UPDATE SET
revenue_target = EXCLUDED.revenue_target,
bill_count_target = EXCLUDED.bill_count_target,
avg_bill_value_target = EXCLUDED.avg_bill_value_target,
member_penetration_target = EXCLUDED.member_penetration_target,
cost_rate_target = EXCLUDED.cost_rate_target,
updated_at = NOW();
-- 3. 生成2026-04目标(用4月实际作为回顾目标,方便展示达成率)
INSERT INTO analytics.dim_store_target (store_code, target_month, revenue_target, bill_count_target, avg_bill_value_target, member_penetration_target, cost_rate_target)
SELECT
r.store_code,
'2026-04-01'::date,
round(r.received, 2) as revenue_target,
r.bill_count as bill_count_target,
round(r.avg_bill_value, 2) as avg_bill_value_target,
round(r.member_bill_share_pct, 2) as member_penetration_target,
30.00 as cost_rate_target
FROM analytics.mv_store_risk_rating_monthly r
WHERE r.month_start = '2026-04-01'
ON CONFLICT (store_code, target_month) DO UPDATE SET
revenue_target = EXCLUDED.revenue_target,
bill_count_target = EXCLUDED.bill_count_target,
avg_bill_value_target = EXCLUDED.avg_bill_value_target,
member_penetration_target = EXCLUDED.member_penetration_target,
cost_rate_target = EXCLUDED.cost_rate_target,
updated_at = NOW();
-- 4. 验证
SELECT '2026-04' as month, count(*) as stores, round(sum(revenue_target)::numeric, 2) as total_target
FROM analytics.dim_store_target WHERE target_month = '2026-04-01'
UNION ALL
SELECT '2026-05', count(*), round(sum(revenue_target)::numeric, 2)
FROM analytics.dim_store_target WHERE target_month = '2026-05-01';