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

104 lines
3.7 KiB
Transact-SQL

USE [JSDataMiddlePlatform];
GO
/*
Unified logical layer (temp-table based, no CREATE VIEW permission required).
Week window = previous natural week:
[start_of_last_week, start_of_this_week)
*/
DECLARE @week_start datetime2 = CAST(DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - 1, 0) AS datetime2);
DECLARE @week_end datetime2 = CAST(DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0) AS datetime2);
IF OBJECT_ID('tempdb..#filtered') IS NOT NULL
DROP TABLE #filtered;
SELECT
a.id,
NULLIF(a.undefined2, '') AS order_id,
NULLIF(a.undefined1, '') AS inner_order_id,
COALESCE(NULLIF(a.undefined8, ''), 'unknown') AS shop_name,
NULLIF(a.undefined9, '') AS shop_code,
NULLIF(a.undefined10, '') AS sku_id,
NULLIF(a.undefined56, '') AS afs_type,
NULLIF(a.undefined57, '') AS afs_reason,
NULLIF(a.undefined58, '') AS afs_result,
ISNULL(NULLIF(a.undefined62, ''), '') AS order_labels,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined20, '')) AS order_qty,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined30, '')) AS shipped_qty,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined47, '')) AS post_ship_apply_amount,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined50, '')) AS post_ship_return_amount,
TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined52, '')) AS post_ship_refund_amount,
a.createdAt AS created_at,
CASE
WHEN CHARINDEX('-', ISNULL(a.undefined8, '')) > 1
THEN LEFT(a.undefined8, CHARINDEX('-', a.undefined8) - 1)
ELSE 'unknown'
END AS platform_name
INTO #filtered
FROM dbo.jst_goods_profit_kpi_items_afs AS a WITH (NOLOCK)
WHERE a.createdAt >= @week_start
AND a.createdAt < @week_end
AND ISNULL(NULLIF(a.undefined2, ''), '') <> ''
AND ISNULL(NULLIF(a.undefined62, ''), '') NOT LIKE '%配件%'
AND ISNULL(NULLIF(a.undefined62, ''), '') NOT LIKE '%特殊单%';
-- 1) weekly overview
SELECT
MIN(created_at) AS data_min_time,
MAX(created_at) AS data_max_time,
COUNT(*) AS afs_record_count,
COUNT(DISTINCT order_id) AS afs_order_count,
SUM(ISNULL(order_qty, 0)) AS order_qty_sum,
SUM(ISNULL(shipped_qty, 0)) AS shipped_qty_sum,
SUM(ISNULL(post_ship_apply_amount, 0)) AS apply_amount,
SUM(ISNULL(post_ship_return_amount, 0)) AS return_amount,
SUM(ISNULL(post_ship_refund_amount, 0)) AS refund_amount
FROM #filtered;
-- 2) platform distribution
SELECT
platform_name,
COUNT(*) AS afs_record_count,
COUNT(DISTINCT order_id) AS afs_order_count,
SUM(ISNULL(shipped_qty, 0)) AS shipped_qty_sum,
SUM(ISNULL(post_ship_refund_amount, 0)) AS refund_amount
FROM #filtered
GROUP BY platform_name
ORDER BY afs_record_count DESC;
-- 3) shop top 20
SELECT TOP (20)
shop_name,
platform_name,
COUNT(*) AS afs_record_count,
COUNT(DISTINCT order_id) AS afs_order_count,
SUM(ISNULL(shipped_qty, 0)) AS shipped_qty_sum,
SUM(ISNULL(post_ship_refund_amount, 0)) AS refund_amount
FROM #filtered
GROUP BY shop_name, platform_name
ORDER BY afs_record_count DESC;
-- 4) reason top 20
SELECT TOP (20)
ISNULL(NULLIF(afs_reason, ''), '未标注') AS afs_reason,
COUNT(*) AS afs_record_count,
SUM(ISNULL(shipped_qty, 0)) AS shipped_qty_sum,
SUM(ISNULL(post_ship_refund_amount, 0)) AS refund_amount,
SUM(ISNULL(post_ship_return_amount, 0)) AS return_amount
FROM #filtered
GROUP BY ISNULL(NULLIF(afs_reason, ''), '未标注')
ORDER BY afs_record_count DESC;
-- 5) type/result matrix
SELECT
ISNULL(NULLIF(afs_type, ''), '未标注') AS afs_type,
ISNULL(NULLIF(afs_result, ''), '未标注') AS afs_result,
COUNT(*) AS afs_record_count,
SUM(ISNULL(shipped_qty, 0)) AS shipped_qty_sum
FROM #filtered
GROUP BY
ISNULL(NULLIF(afs_type, ''), '未标注'),
ISNULL(NULLIF(afs_result, ''), '未标注')
ORDER BY afs_record_count DESC;