USE [JSDataMiddlePlatform]; GO /* Template: 售后360分析(退款 + 原因 + 工单 + 客诉) Window: 上一个自然周 [week_start, week_end) */ 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..#chat_latest') IS NOT NULL DROP TABLE #chat_latest; WITH chat_rank AS ( SELECT NULLIF(c.orderNo, '') AS order_id, ISNULL(NULLIF(c.mainReason, ''), '') AS main_reason, ISNULL(NULLIF(c.secondReason, ''), '') AS second_reason, ISNULL(NULLIF(c.thirdReason, ''), '') AS third_reason, c.createdAt, ROW_NUMBER() OVER ( PARTITION BY NULLIF(c.orderNo, '') ORDER BY c.createdAt DESC, c.id DESC ) AS rn FROM dbo.pc_kfChatLog AS c WITH (NOLOCK) WHERE c.createdAt >= @week_start AND c.createdAt < @week_end AND ISNULL(NULLIF(c.orderNo, ''), '') <> '' ) SELECT order_id, main_reason, second_reason, third_reason INTO #chat_latest FROM chat_rank WHERE rn = 1; IF OBJECT_ID('tempdb..#afs') IS NOT NULL DROP TABLE #afs; SELECT NULLIF(a.undefined2, '') AS order_id, 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, ISNULL(NULLIF(a.undefined56, ''), '未标注') AS afs_type, ISNULL(NULLIF(a.undefined58, ''), '未标注') AS afs_result, ISNULL(NULLIF(a.undefined57, ''), '') AS native_reason, ISNULL(cl.main_reason, '') AS chat_main_reason, ISNULL(cl.second_reason, '') AS chat_second_reason, ISNULL(cl.third_reason, '') AS chat_third_reason, CASE WHEN ISNULL(NULLIF(a.undefined57, ''), '') <> '' THEN ISNULL(NULLIF(a.undefined57, ''), '') WHEN ISNULL(cl.main_reason, '') <> '' THEN cl.main_reason ELSE '未标注' END AS afs_reason_l1, CASE WHEN ISNULL(cl.second_reason, '') <> '' THEN cl.second_reason ELSE '未标注' END AS afs_reason_l2, CASE WHEN ISNULL(cl.third_reason, '') <> '' THEN cl.third_reason ELSE '未标注' END AS afs_reason_l3, CASE WHEN ISNULL(NULLIF(a.undefined57, ''), '') <> '' THEN 'afs_reason' WHEN ISNULL(cl.main_reason, '') <> '' THEN 'chat_main_reason' ELSE 'unknown' END AS reason_source, 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.undefined26, '')) AS payment_amount, TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined47, '')) AS apply_amount, TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined50, '')) AS return_amount, TRY_CONVERT(decimal(18, 2), NULLIF(a.undefined52, '')) AS refund_amount INTO #afs FROM dbo.jst_goods_profit_kpi_items_afs AS a WITH (NOLOCK) LEFT JOIN #chat_latest AS cl ON cl.order_id = NULLIF(a.undefined2, '') 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 '%特殊单%'; IF OBJECT_ID('tempdb..#install') IS NOT NULL DROP TABLE #install; SELECT NULLIF(i.OrderNum, '') AS order_id, i.SubmitTime, TRY_CONVERT(int, i.StatusId) AS status_id, TRY_CONVERT(int, i.installComplete) AS install_complete, TRY_CONVERT(decimal(18, 2), i.Num) AS install_num, TRY_CONVERT(decimal(18, 2), i.PayMent) AS payment_amount, TRY_CONVERT(decimal(18, 2), i.installcost) AS install_cost, TRY_CONVERT(decimal(18, 2), i.settleAmount) AS settle_amount, TRY_CONVERT(int, i.kfsh) AS kf_audit, TRY_CONVERT(int, i.cwsh) AS cw_audit, ISNULL(NULLIF(i.Province, ''), 'unknown') AS province, ISNULL(NULLIF(i.City, ''), 'unknown') AS city INTO #install FROM dbo.fys_Ticketing_install AS i WITH (NOLOCK) WHERE i.SubmitTime >= @week_start AND i.SubmitTime < @week_end AND ISNULL(NULLIF(i.OrderNum, ''), '') <> '' AND (i.[Delete] = 0 OR i.[Delete] IS NULL); -- 1) 售后总览(退款口径) SELECT @week_start AS week_start, @week_end AS week_end, 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(payment_amount, 0)) AS payment_amount, SUM(ISNULL(refund_amount, 0)) AS refund_amount, SUM(ISNULL(return_amount, 0)) AS return_amount, 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 FROM #afs; -- 2) 售后原因分析(一级原因 + 来源) SELECT TOP (30) afs_reason_l1 AS afs_reason, reason_source, COUNT(*) AS afs_record_count, COUNT(DISTINCT order_id) AS order_count, SUM(ISNULL(shipped_qty, 0)) AS shipped_qty_sum, SUM(ISNULL(refund_amount, 0)) AS refund_amount, CASE WHEN SUM(ISNULL(payment_amount, 0)) = 0 THEN NULL ELSE SUM(ISNULL(refund_amount, 0)) / SUM(ISNULL(payment_amount, 0)) END AS reason_refund_rate FROM #afs GROUP BY afs_reason_l1, reason_source ORDER BY afs_record_count DESC; -- 3) 售后二级原因 TOP20 SELECT TOP (20) afs_reason_l1, afs_reason_l2, COUNT(*) AS afs_record_count, SUM(ISNULL(shipped_qty, 0)) AS shipped_qty_sum, SUM(ISNULL(refund_amount, 0)) AS refund_amount FROM #afs GROUP BY afs_reason_l1, afs_reason_l2 ORDER BY afs_record_count DESC; -- 4) 售后类型/结果矩阵 SELECT afs_type, afs_result, COUNT(*) AS afs_record_count, SUM(ISNULL(shipped_qty, 0)) AS shipped_qty_sum, SUM(ISNULL(refund_amount, 0)) AS refund_amount FROM #afs GROUP BY afs_type, afs_result ORDER BY afs_record_count DESC; -- 5) 安装工单概览(同周期) SELECT COUNT(*) AS install_ticket_count, COUNT(DISTINCT order_id) AS install_order_count, SUM(ISNULL(install_num, 0)) AS install_piece_count, SUM(ISNULL(payment_amount, 0)) AS install_payment_amount, SUM(ISNULL(install_cost, 0)) AS install_cost, SUM(ISNULL(settle_amount, 0)) AS settle_amount, SUM(CASE WHEN ISNULL(install_complete, 0) = 1 THEN 1 ELSE 0 END) AS install_completed_count, SUM(CASE WHEN ISNULL(kf_audit, 0) <> 1 OR ISNULL(cw_audit, 0) <> 1 THEN 1 ELSE 0 END) AS pending_audit_count FROM #install; -- 6) 售后退款与安装工单联动(按订单) SELECT COUNT(*) AS overlap_order_count, SUM(ISNULL(a.refund_amount, 0)) AS overlap_refund_amount, SUM(ISNULL(i.install_cost, 0)) AS overlap_install_cost, SUM(CASE WHEN ISNULL(i.install_complete, 0) = 1 THEN 1 ELSE 0 END) AS overlap_install_completed_count FROM ( SELECT DISTINCT order_id, refund_amount FROM #afs WHERE ISNULL(order_id, '') <> '' ) a INNER JOIN #install i ON i.order_id = a.order_id;