104 lines
3.2 KiB
Transact-SQL
104 lines
3.2 KiB
Transact-SQL
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;
|