dalongxia/sqlserver/fee_ratio_alert.sql
2026-03-04 13:25:48 +08:00

180 lines
6.8 KiB
Transact-SQL

USE [JSDataMiddlePlatform];
GO
/*
Template: 费比异常预警
Window: 最近14天 [date_from, date_to)
*/
DECLARE @date_from datetime2 = CAST(DATEADD(DAY, -14, CAST(GETDATE() AS date)) AS datetime2);
DECLARE @date_to datetime2 = CAST(DATEADD(DAY, 1, CAST(GETDATE() AS date)) AS datetime2);
IF OBJECT_ID('tempdb..#base') IS NOT NULL
DROP TABLE #base;
SELECT
CAST(a.createdAt AS date) AS biz_date,
COALESCE(NULLIF(a.undefined8, ''), 'unknown') AS shop_name,
CASE
WHEN CHARINDEX('-', ISNULL(a.undefined8, '')) > 1
THEN LEFT(a.undefined8, CHARINDEX('-', a.undefined8) - 1)
ELSE 'unknown'
END AS platform_name,
NULLIF(a.undefined2, '') AS order_id,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined26, '')) AS payment_amount,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined52, '')) AS refund_amount,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined82, '')) AS fee_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined85, '')) AS fee_taoke,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined86, '')) AS fee_freight_insurance,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined97, '')) AS fee_promotion,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined102, '')) AS fee_software_service,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined108, '')) AS fee_taobao_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined109, '')) AS fee_jd_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined110, '')) AS fee_pdd_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined111, '')) AS fee_taogongchang_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined112, '')) AS fee_alibaba_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined113, '')) AS fee_douyin_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined114, '')) AS fee_maoning_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined115, '')) AS fee_vip_mp_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined116, '')) AS fee_vip_commission,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined117, '')) AS fee_dewu_commission,
ISNULL(NULLIF(a.undefined62, ''), '') AS order_labels
INTO #base
FROM dbo.jst_goods_profit_kpi_items_afs AS a WITH (NOLOCK)
WHERE a.createdAt >= @date_from
AND a.createdAt < @date_to
AND ISNULL(NULLIF(a.undefined2, ''), '') <> ''
AND ISNULL(NULLIF(a.undefined62, ''), '') NOT LIKE '%配件%'
AND ISNULL(NULLIF(a.undefined62, ''), '') NOT LIKE '%特殊单%';
IF OBJECT_ID('tempdb..#agg') IS NOT NULL
DROP TABLE #agg;
SELECT
shop_name,
platform_name,
COUNT(DISTINCT order_id) AS order_count,
SUM(ISNULL(payment_amount, 0)) AS payment_amount,
SUM(ISNULL(refund_amount, 0)) AS refund_amount,
SUM(
ABS(ISNULL(fee_commission, 0))
+ ABS(ISNULL(fee_taoke, 0))
+ ABS(ISNULL(fee_freight_insurance, 0))
+ ABS(ISNULL(fee_promotion, 0))
+ ABS(ISNULL(fee_software_service, 0))
+ ABS(ISNULL(fee_taobao_commission, 0))
+ ABS(ISNULL(fee_jd_commission, 0))
+ ABS(ISNULL(fee_pdd_commission, 0))
+ ABS(ISNULL(fee_taogongchang_commission, 0))
+ ABS(ISNULL(fee_alibaba_commission, 0))
+ ABS(ISNULL(fee_douyin_commission, 0))
+ ABS(ISNULL(fee_maoning_commission, 0))
+ ABS(ISNULL(fee_vip_mp_commission, 0))
+ ABS(ISNULL(fee_vip_commission, 0))
+ ABS(ISNULL(fee_dewu_commission, 0))
) AS fee_amount_abs
INTO #agg
FROM #base
GROUP BY shop_name, platform_name;
-- 1) 全局预警总览
SELECT
@date_from AS date_from,
@date_to AS date_to,
COUNT(*) AS shop_count,
SUM(order_count) AS order_count,
SUM(payment_amount) AS payment_amount,
SUM(refund_amount) AS refund_amount,
SUM(fee_amount_abs) AS fee_amount_abs,
CASE
WHEN SUM(payment_amount) = 0 THEN NULL
ELSE SUM(refund_amount) / SUM(payment_amount)
END AS refund_rate,
CASE
WHEN SUM(payment_amount) = 0 THEN NULL
ELSE SUM(fee_amount_abs) / SUM(payment_amount)
END AS fee_abs_rate
FROM #agg;
-- 2) 店铺级异常清单
SELECT
shop_name,
platform_name,
order_count,
payment_amount,
refund_amount,
fee_amount_abs,
CASE
WHEN payment_amount = 0 THEN NULL
ELSE refund_amount / payment_amount
END AS refund_rate,
CASE
WHEN payment_amount = 0 THEN NULL
ELSE fee_amount_abs / payment_amount
END AS fee_abs_rate,
CASE
WHEN payment_amount = 0 THEN 'P3'
WHEN (fee_amount_abs / payment_amount) >= 0.35 OR (refund_amount / payment_amount) >= 0.25 THEN 'P1'
WHEN (fee_amount_abs / payment_amount) >= 0.25 OR (refund_amount / payment_amount) >= 0.18 THEN 'P2'
ELSE 'P3'
END AS alert_level
FROM #agg
WHERE order_count >= 30
ORDER BY
CASE
WHEN payment_amount = 0 THEN 0
ELSE fee_amount_abs / payment_amount
END DESC,
refund_amount DESC;
-- 3) 日趋势(全局)
SELECT
biz_date,
COUNT(DISTINCT order_id) AS order_count,
SUM(ISNULL(payment_amount, 0)) AS payment_amount,
SUM(ISNULL(refund_amount, 0)) AS refund_amount,
SUM(
ABS(ISNULL(fee_commission, 0))
+ ABS(ISNULL(fee_taoke, 0))
+ ABS(ISNULL(fee_freight_insurance, 0))
+ ABS(ISNULL(fee_promotion, 0))
+ ABS(ISNULL(fee_software_service, 0))
+ ABS(ISNULL(fee_taobao_commission, 0))
+ ABS(ISNULL(fee_jd_commission, 0))
+ ABS(ISNULL(fee_pdd_commission, 0))
+ ABS(ISNULL(fee_taogongchang_commission, 0))
+ ABS(ISNULL(fee_alibaba_commission, 0))
+ ABS(ISNULL(fee_douyin_commission, 0))
+ ABS(ISNULL(fee_maoning_commission, 0))
+ ABS(ISNULL(fee_vip_mp_commission, 0))
+ ABS(ISNULL(fee_vip_commission, 0))
+ ABS(ISNULL(fee_dewu_commission, 0))
) AS fee_amount_abs,
CASE
WHEN SUM(ISNULL(payment_amount, 0)) = 0 THEN NULL
ELSE SUM(ISNULL(refund_amount, 0)) / SUM(ISNULL(payment_amount, 0))
END AS refund_rate,
CASE
WHEN SUM(ISNULL(payment_amount, 0)) = 0 THEN NULL
ELSE SUM(
ABS(ISNULL(fee_commission, 0))
+ ABS(ISNULL(fee_taoke, 0))
+ ABS(ISNULL(fee_freight_insurance, 0))
+ ABS(ISNULL(fee_promotion, 0))
+ ABS(ISNULL(fee_software_service, 0))
+ ABS(ISNULL(fee_taobao_commission, 0))
+ ABS(ISNULL(fee_jd_commission, 0))
+ ABS(ISNULL(fee_pdd_commission, 0))
+ ABS(ISNULL(fee_taogongchang_commission, 0))
+ ABS(ISNULL(fee_alibaba_commission, 0))
+ ABS(ISNULL(fee_douyin_commission, 0))
+ ABS(ISNULL(fee_maoning_commission, 0))
+ ABS(ISNULL(fee_vip_mp_commission, 0))
+ ABS(ISNULL(fee_vip_commission, 0))
+ ABS(ISNULL(fee_dewu_commission, 0))
) / SUM(ISNULL(payment_amount, 0))
END AS fee_abs_rate
FROM #base
GROUP BY biz_date
ORDER BY biz_date DESC;