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

194 lines
7.0 KiB
Transact-SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;