68 lines
3.0 KiB
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';
|