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

104 lines
3.2 KiB
Transact-SQL
Raw 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: 运费效率分析
Window: 最近30天 [date_from, date_to)
*/
DECLARE @date_from datetime2 = CAST(DATEADD(DAY, -30, 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
fc.so_id AS order_id,
ISNULL(NULLIF(fc.shop_name, ''), 'unknown') AS shop_name,
CASE
WHEN CHARINDEX('-', ISNULL(fc.shop_name, '')) > 1
THEN LEFT(fc.shop_name, CHARINDEX('-', fc.shop_name) - 1)
ELSE 'unknown'
END AS platform_name,
ISNULL(NULLIF(fc.receiver_state, ''), 'unknown') AS receiver_state,
ISNULL(NULLIF(fc.expressName, ''), 'unknown') AS express_name,
TRY_CONVERT(decimal(18, 2), fc.weight) AS weight,
TRY_CONVERT(decimal(18, 2), fc.freightCost) AS freight_cost,
fc.send_date,
fc.type AS freight_type
INTO #base
FROM dbo.fys_jstFreightCost AS fc WITH (NOLOCK)
WHERE fc.send_date >= @date_from
AND fc.send_date < @date_to
AND ISNULL(NULLIF(fc.so_id, ''), '') <> '';
-- 1) 总览
SELECT
@date_from AS date_from,
@date_to AS date_to,
COUNT(*) AS shipment_count,
SUM(ISNULL(weight, 0)) AS total_weight,
SUM(ISNULL(freight_cost, 0)) AS total_freight_cost,
CASE
WHEN COUNT(*) = 0 THEN NULL
ELSE SUM(ISNULL(freight_cost, 0)) / COUNT(*)
END AS avg_cost_per_order,
CASE
WHEN SUM(ISNULL(weight, 0)) = 0 THEN NULL
ELSE SUM(ISNULL(freight_cost, 0)) / SUM(ISNULL(weight, 0))
END AS avg_cost_per_kg
FROM #base;
-- 2) 平台运费效率
SELECT
platform_name,
COUNT(*) AS shipment_count,
SUM(ISNULL(weight, 0)) AS total_weight,
SUM(ISNULL(freight_cost, 0)) AS total_freight_cost,
CASE
WHEN COUNT(*) = 0 THEN NULL
ELSE SUM(ISNULL(freight_cost, 0)) / COUNT(*)
END AS avg_cost_per_order,
CASE
WHEN SUM(ISNULL(weight, 0)) = 0 THEN NULL
ELSE SUM(ISNULL(freight_cost, 0)) / SUM(ISNULL(weight, 0))
END AS avg_cost_per_kg
FROM #base
GROUP BY platform_name
ORDER BY shipment_count DESC;
-- 3) 店铺运费异常(发货单>=100)
SELECT TOP (50)
shop_name,
platform_name,
COUNT(*) AS shipment_count,
SUM(ISNULL(weight, 0)) AS total_weight,
SUM(ISNULL(freight_cost, 0)) AS total_freight_cost,
CASE
WHEN COUNT(*) = 0 THEN NULL
ELSE SUM(ISNULL(freight_cost, 0)) / COUNT(*)
END AS avg_cost_per_order,
CASE
WHEN SUM(ISNULL(weight, 0)) = 0 THEN NULL
ELSE SUM(ISNULL(freight_cost, 0)) / SUM(ISNULL(weight, 0))
END AS avg_cost_per_kg
FROM #base
GROUP BY shop_name, platform_name
HAVING COUNT(*) >= 100
ORDER BY avg_cost_per_kg DESC, shipment_count DESC;
-- 4) 省份与快递公司组合成本
SELECT TOP (50)
receiver_state,
express_name,
COUNT(*) AS shipment_count,
SUM(ISNULL(weight, 0)) AS total_weight,
SUM(ISNULL(freight_cost, 0)) AS total_freight_cost,
CASE
WHEN SUM(ISNULL(weight, 0)) = 0 THEN NULL
ELSE SUM(ISNULL(freight_cost, 0)) / SUM(ISNULL(weight, 0))
END AS avg_cost_per_kg
FROM #base
GROUP BY receiver_state, express_name
ORDER BY total_freight_cost DESC;