use [调试];
DROP TABLE IF EXISTS [现上化];
SELECT * into [现上化]
FROM OPENROWSET('MICROSOFT.ACE.OLEDB.12.0','Excel 5.0;HDR=YES; DATABASE=D:\线上化调试.xlsx',[Sheet3$]) -- 修改!!!
DECLARE @sql_mac nvarchar(max);
DECLARE @sql_mic nvarchar(max);
DROP TABLE IF EXISTS #COMBINEData;
DROP TABLE IF EXISTS #FinalResult;
DROP TABLE IF EXISTS #CCC;
DROP TABLE IF EXISTS #bbbb;
-- 创建临时表并插入数据
SELECT * INTO #COMBINEData FROM [现上化];
-- 获取当前日期和前一天的日期
DECLARE @currentdate date = CAST(GETDATE() AS date);
DECLARE @previousDate date = DATEADD(DAY, -1, @currentDate);
--———————————————————————————————— —— 宏观量 ————————————————————————————————————————————
WITH 合计_大区级别 AS (
SELECT 营运区, 大区,
'合计' AS 公斤段,
ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0) AS '9月日均重量', --修改天数
ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) AS '10月日均重量', --修改天数
CASE WHEN ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) = 0 THEN 0
ELSE ((ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) - ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0)) / (ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) * 100 END AS 环比增长
FROM #COMBINEData
GROUP BY 营运区, 大区
),
宏观量_大区级别 AS (
SELECT * FROM 合计_大区级别
UNION ALL
SELECT 营运区, 大区,
公斤段,
ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0) AS '9月日均重量', --修改天数
ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) AS '10月日均重量', --修改天数
CASE WHEN ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) = 0 THEN 0
ELSE ((ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) - ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0)) / (ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) * 100 END AS 环比增长
FROM #COMBINEData
GROUP BY 营运区, 大区, 公斤段
),
取数_大区级别 AS (
SELECT 宏观量_大区级别.营运区, 宏观量_大区级别.大区 AS 寄件区域, 宏观量_大区级别.公斤段, 宏观量_大区级别.[9月日均重量], 宏观量_大区级别.[10月日均重量], 宏观量_大区级别.环比增长
FROM 宏观量_大区级别
),
合计_营运区级别 AS (
SELECT 营运区,
'合计' AS 公斤段,
ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0) AS '9月日均重量', --修改天数
ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) AS '10月日均重量', --修改天数
CASE WHEN ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) = 0 THEN 0
ELSE ((ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) - ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0)) / (ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) * 100 END AS 环比增长
FROM #COMBINEData
GROUP BY 营运区
),
宏观量_营运区级别 AS (
SELECT * FROM 合计_营运区级别
UNION ALL
SELECT 营运区,
公斤段,
ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0) AS '9月日均重量', --修改天数
ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) AS '10月日均重量', --修改天数
CASE WHEN ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) = 0 THEN 0
ELSE ((ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) - ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0)) / (ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) * 100 END AS 环比增长
FROM #COMBINEData
GROUP BY 营运区, 公斤段
),
取数_营运区级别 AS (
SELECT 宏观量_营运区级别.营运区, 宏观量_营运区级别.营运区 AS 寄件区域, 宏观量_营运区级别.公斤段, 宏观量_营运区级别.[9月日均重量], 宏观量_营运区级别.[10月日均重量], 宏观量_营运区级别.环比增长
FROM 宏观量_营运区级别
) ,
mac_FinalResult AS(
SELECT * FROM 取数_大区级别
UNION ALL
SELECT * FROM 取数_营运区级别
),
--———————————————————————————————— 微观量 ————————————————————————————————————————————
mic_FinalResult AS(
-- 创建临时表 bbbb,并添加计算合计行数据的逻辑
WITH 微观量_大区级别 AS (
SELECT 营运区,大区,公斤段, '9月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,公斤段,日期
UNION ALL
SELECT 营运区,大区,公斤段, '10月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,公斤段,日期
UNION ALL
SELECT 营运区,大区,公斤段, '货差' AS 对比月份, 日期, CAST((isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000-isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000) AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,公斤段,日期
-- 添加计算合计行的逻辑,针对每个大区、每个对比月份进行合计计算
UNION ALL
SELECT 营运区,大区, '合计' AS 公斤段, '9月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,日期
UNION ALL
SELECT 营运区,大区, '合计' AS 公斤段, '10月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,日期
UNION ALL
SELECT 营运区,大区, '合计' AS 公斤段, '货差' AS 对比月份, 日期, CAST((isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000-isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000) AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,日期
),
微观量_营运区级别 AS (
SELECT 营运区,#COMBINEData.营运区 as 大区,公斤段, '9月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,公斤段,日期
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区,公斤段, '10月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,公斤段,日期
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区,公斤段, '货差' AS 对比月份, 日期, CAST(COALESCE(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000-COALESCE(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,公斤段,日期
-- 添加计算合计行的逻辑,针对每个大区、每个对比月份进行合计计算
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区, '合计' AS 公斤段, '9月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,日期
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区, '合计' AS 公斤段, '10月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,日期
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区, '合计' AS 公斤段, '货差' AS 对比月份, 日期, CAST((isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000-isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000) AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,日期
),
整体取数 as (
select * from 微观量_大区级别
union all
select * from 微观量_营运区级别
)
SELECT * INTO #bbbb FROM 整体取数;
-- 注释:首先使用公用表表达式(CTE)微观量_大区级别,对#COMBINEData 临时表中的数据进行处理,按照不同的条件计算出结算重量并生成对比月份列,同时添加了合计行的计算逻辑。然后从 CTE 微观量_大区级别 中选取所有数据创建另一个临时表#bbbb。
-- 构建动态 SQL
DECLARE @startdate int = 1;
DECLARE @endDate int = DAY(@previousDate);
SET @sql_mic = N'SELECT 营运区,大区,公斤段,对比月份';
-- 注释:声明两个整数变量@startDate 和@endDate,@startDate 初始化为 1,@endDate 设置为前一天日期的天数部分。接着初始化动态 SQL 变量@sql_mic,开始构建查询语句的开头部分,选择营运区、大区、公斤段和对比月份这几个列。
WHILE @startDate <= @endDate
BEGIN
SET @sql_mic = @sql_mic + N', ISNULL(MAX(CASE WHEN 日期 = ''' + CAST(@startDate AS nvarchar(10)) + N''' THEN 结算重量 END), 0) AS [' + CAST(@startDate AS nvarchar(10)) + N' 号]';
SET @startDate = @startDate + 1;
END;
-- 注释:这是一个循环,在循环中动态构建查询语句,对于每个日期从 1 到前一天的天数,使用 MAX 和 CASE WHEN 语句来确定结算重量,并使用 ISNULL 函数将 NULL值转换为 0,然后将结果作为一个新的列添加到查询语句中,列名为[X 号],X 是当前日期的值。
SET @sql_mic = @sql_mic + N' FROM #bbbb GROUP BY 营运区,大区,公斤段,对比月份 ORDER BY 营运区,大区,';
SET @sql_mic = @sql_mic + N' CASE 公斤段 WHEN ''0-70kg'' THEN 1 WHEN ''70-300kg'' THEN 2 WHEN ''300-500kg'' THEN 3 WHEN ''500-800kg'' THEN 4 WHEN ''800-1500kg'' THEN 5 WHEN ''1500-3000kg'' THEN 6 WHEN ''3000kg以上'' THEN 7 ELSE 8 END,';
SET @sql_mic = @sql_mic + N' CASE 对比月份 WHEN ''9月结'' THEN 1 WHEN ''10月结'' THEN 2 ELSE 3 END';
-- 注释:在循环结束后,继续向动态 SQL 变量添加查询语句的剩余部分,包括从临时表#bbbb 中选取数据、按照营运区、大区、公斤段和对比月份进行分组,以及按照公斤段和对比月份进行排序的条件。
-- 执行动态 SQL
EXEC sp_executesql @sql_mic;
-- 注释:执行动态构建的 SQL 查询语句。
)
--———————————————————————————————— 连接 ————————————————————————————————————————————
-- 构建动态 SQL
DECLARE @startDate int = 1;
DECLARE @endDate int = DAY(@previousDate);
SET @sql_mic = N'select mic_FinalResult.[营运区], mic_FinalResult.[大区],mic_FinalResult.[公斤段],
mac_FinalResult.[9月日均重量],mac_FinalResult.[10月日均重量],mac_FinalResult.[环比增长],mac_FinalResult.[对比月份]';
-- 注释:声明两个整数变量@startDate 和@endDate,@startDate 初始化为 1,@endDate 设置为前一天日期的天数部分。接着初始化动态 SQL 变量@sql_mic,开始构建查询语句的开头部分,选择营运区、大区、公斤段和对比月份这几个列。
WHILE @startDate <= @endDate
BEGIN
SET @sql_mic = @sql_mic + N', ISNULL(MAX(CASE WHEN 日期 = ''' + CAST(@startDate AS nvarchar(10)) + N''' THEN 结算重量 END), 0) AS [' + CAST(@startDate AS nvarchar(10)) + N' 号]';
SET @startDate = @startDate + 1;
END;
-- 注释:这是一个循环,在循环中动态构建查询语句,对于每个日期从 1 到前一天的天数,使用 MAX 和 CASE WHEN 语句来确定结算重量,并使用 ISNULL 函数将 NULL值转换为 0,然后将结果作为一个新的列添加到查询语句中,列名为[X 号],X 是当前日期的值。
SET @sql_mic = @sql_mic + N' FROM mic_FinalResult left join mac_FinalResult on (mic_FinalResult.[营运区]=mac_FinalResult.[营运区] and mic_FinalResult.[大区]=mac_FinalResult.[寄件区域] and mic_FinalResult.[公斤段]=mac_FinalResult.[公斤段]
GROUP BY mic_FinalResult.[营运区], mic_FinalResult.[大区],mic_FinalResult.[公斤段],mac_FinalResult.[对比月份]
ORDER BY mic_FinalResult.[营运区], mic_FinalResult.[大区],';
SET @sql_mic = @sql_mic + N' CASE mic_FinalResult.[公斤段] WHEN ''0-70kg'' THEN 1 WHEN ''70-300kg'' THEN 2 WHEN ''300-500kg'' THEN 3 WHEN ''500-800kg'' THEN 4 WHEN ''800-1500kg'' THEN 5 WHEN ''1500-3000kg'' THEN 6 WHEN ''3000kg以上'' THEN 7 ELSE 8 END,';
SET @sql_mic = @sql_mic + N' CASE mac_FinalResult.[对比月份] WHEN ''9月结'' THEN 1 WHEN ''10月结'' THEN 2 ELSE 3 END';
-- 注释:在循环结束后,继续向动态 SQL 变量添加查询语句的剩余部分,包括从临时表#bbbb 中选取数据、按照营运区、大区、公斤段和对比月份进行分组,以及按照公斤段和对比月份进行排序的条件。
-- 执行动态 SQL
EXEC sp_executesql @sql_mic;
-- 注释:执行动态构建的 SQL 查询语句。

DROP TABLE IF EXISTS [现上化];
SELECT * into [现上化]
FROM OPENROWSET('MICROSOFT.ACE.OLEDB.12.0','Excel 5.0;HDR=YES; DATABASE=D:\线上化调试.xlsx',[Sheet3$]) -- 修改!!!
DECLARE @sql_mac nvarchar(max);
DECLARE @sql_mic nvarchar(max);
DROP TABLE IF EXISTS #COMBINEData;
DROP TABLE IF EXISTS #FinalResult;
DROP TABLE IF EXISTS #CCC;
DROP TABLE IF EXISTS #bbbb;
-- 创建临时表并插入数据
SELECT * INTO #COMBINEData FROM [现上化];
-- 获取当前日期和前一天的日期
DECLARE @currentdate date = CAST(GETDATE() AS date);
DECLARE @previousDate date = DATEADD(DAY, -1, @currentDate);
--———————————————————————————————— —— 宏观量 ————————————————————————————————————————————
WITH 合计_大区级别 AS (
SELECT 营运区, 大区,
'合计' AS 公斤段,
ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0) AS '9月日均重量', --修改天数
ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) AS '10月日均重量', --修改天数
CASE WHEN ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) = 0 THEN 0
ELSE ((ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) - ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0)) / (ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) * 100 END AS 环比增长
FROM #COMBINEData
GROUP BY 营运区, 大区
),
宏观量_大区级别 AS (
SELECT * FROM 合计_大区级别
UNION ALL
SELECT 营运区, 大区,
公斤段,
ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0) AS '9月日均重量', --修改天数
ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) AS '10月日均重量', --修改天数
CASE WHEN ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) = 0 THEN 0
ELSE ((ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) - ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0)) / (ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) * 100 END AS 环比增长
FROM #COMBINEData
GROUP BY 营运区, 大区, 公斤段
),
取数_大区级别 AS (
SELECT 宏观量_大区级别.营运区, 宏观量_大区级别.大区 AS 寄件区域, 宏观量_大区级别.公斤段, 宏观量_大区级别.[9月日均重量], 宏观量_大区级别.[10月日均重量], 宏观量_大区级别.环比增长
FROM 宏观量_大区级别
),
合计_营运区级别 AS (
SELECT 营运区,
'合计' AS 公斤段,
ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0) AS '9月日均重量', --修改天数
ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) AS '10月日均重量', --修改天数
CASE WHEN ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) = 0 THEN 0
ELSE ((ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) - ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0)) / (ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) * 100 END AS 环比增长
FROM #COMBINEData
GROUP BY 营运区
),
宏观量_营运区级别 AS (
SELECT * FROM 合计_营运区级别
UNION ALL
SELECT 营运区,
公斤段,
ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0) AS '9月日均重量', --修改天数
ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) AS '10月日均重量', --修改天数
CASE WHEN ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0) = 0 THEN 0
ELSE ((ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) - ISNULL(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END) / 1000 / 24, 0)) / (ISNULL(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END) / 1000 / 18, 0)) * 100 END AS 环比增长
FROM #COMBINEData
GROUP BY 营运区, 公斤段
),
取数_营运区级别 AS (
SELECT 宏观量_营运区级别.营运区, 宏观量_营运区级别.营运区 AS 寄件区域, 宏观量_营运区级别.公斤段, 宏观量_营运区级别.[9月日均重量], 宏观量_营运区级别.[10月日均重量], 宏观量_营运区级别.环比增长
FROM 宏观量_营运区级别
) ,
mac_FinalResult AS(
SELECT * FROM 取数_大区级别
UNION ALL
SELECT * FROM 取数_营运区级别
),
--———————————————————————————————— 微观量 ————————————————————————————————————————————
mic_FinalResult AS(
-- 创建临时表 bbbb,并添加计算合计行数据的逻辑
WITH 微观量_大区级别 AS (
SELECT 营运区,大区,公斤段, '9月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,公斤段,日期
UNION ALL
SELECT 营运区,大区,公斤段, '10月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,公斤段,日期
UNION ALL
SELECT 营运区,大区,公斤段, '货差' AS 对比月份, 日期, CAST((isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000-isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000) AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,公斤段,日期
-- 添加计算合计行的逻辑,针对每个大区、每个对比月份进行合计计算
UNION ALL
SELECT 营运区,大区, '合计' AS 公斤段, '9月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,日期
UNION ALL
SELECT 营运区,大区, '合计' AS 公斤段, '10月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,日期
UNION ALL
SELECT 营运区,大区, '合计' AS 公斤段, '货差' AS 对比月份, 日期, CAST((isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000-isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000) AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,大区,日期
),
微观量_营运区级别 AS (
SELECT 营运区,#COMBINEData.营运区 as 大区,公斤段, '9月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,公斤段,日期
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区,公斤段, '10月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,公斤段,日期
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区,公斤段, '货差' AS 对比月份, 日期, CAST(COALESCE(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000-COALESCE(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,公斤段,日期
-- 添加计算合计行的逻辑,针对每个大区、每个对比月份进行合计计算
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区, '合计' AS 公斤段, '9月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,日期
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区, '合计' AS 公斤段, '10月结' AS 对比月份, 日期, CAST(isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000 AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,日期
UNION ALL
SELECT 营运区,#COMBINEData.营运区 as 大区, '合计' AS 公斤段, '货差' AS 对比月份, 日期, CAST((isnull(SUM(CASE WHEN 月份 = '10月' THEN 结算重量 END),0)/1000-isnull(SUM(CASE WHEN 月份 = '9月' THEN 结算重量 END),0)/1000) AS NVARCHAR(MAX)) AS 结算重量
FROM #COMBINEData
GROUP BY 营运区,#COMBINEData.营运区,日期
),
整体取数 as (
select * from 微观量_大区级别
union all
select * from 微观量_营运区级别
)
SELECT * INTO #bbbb FROM 整体取数;
-- 注释:首先使用公用表表达式(CTE)微观量_大区级别,对#COMBINEData 临时表中的数据进行处理,按照不同的条件计算出结算重量并生成对比月份列,同时添加了合计行的计算逻辑。然后从 CTE 微观量_大区级别 中选取所有数据创建另一个临时表#bbbb。
-- 构建动态 SQL
DECLARE @startdate int = 1;
DECLARE @endDate int = DAY(@previousDate);
SET @sql_mic = N'SELECT 营运区,大区,公斤段,对比月份';
-- 注释:声明两个整数变量@startDate 和@endDate,@startDate 初始化为 1,@endDate 设置为前一天日期的天数部分。接着初始化动态 SQL 变量@sql_mic,开始构建查询语句的开头部分,选择营运区、大区、公斤段和对比月份这几个列。
WHILE @startDate <= @endDate
BEGIN
SET @sql_mic = @sql_mic + N', ISNULL(MAX(CASE WHEN 日期 = ''' + CAST(@startDate AS nvarchar(10)) + N''' THEN 结算重量 END), 0) AS [' + CAST(@startDate AS nvarchar(10)) + N' 号]';
SET @startDate = @startDate + 1;
END;
-- 注释:这是一个循环,在循环中动态构建查询语句,对于每个日期从 1 到前一天的天数,使用 MAX 和 CASE WHEN 语句来确定结算重量,并使用 ISNULL 函数将 NULL值转换为 0,然后将结果作为一个新的列添加到查询语句中,列名为[X 号],X 是当前日期的值。
SET @sql_mic = @sql_mic + N' FROM #bbbb GROUP BY 营运区,大区,公斤段,对比月份 ORDER BY 营运区,大区,';
SET @sql_mic = @sql_mic + N' CASE 公斤段 WHEN ''0-70kg'' THEN 1 WHEN ''70-300kg'' THEN 2 WHEN ''300-500kg'' THEN 3 WHEN ''500-800kg'' THEN 4 WHEN ''800-1500kg'' THEN 5 WHEN ''1500-3000kg'' THEN 6 WHEN ''3000kg以上'' THEN 7 ELSE 8 END,';
SET @sql_mic = @sql_mic + N' CASE 对比月份 WHEN ''9月结'' THEN 1 WHEN ''10月结'' THEN 2 ELSE 3 END';
-- 注释:在循环结束后,继续向动态 SQL 变量添加查询语句的剩余部分,包括从临时表#bbbb 中选取数据、按照营运区、大区、公斤段和对比月份进行分组,以及按照公斤段和对比月份进行排序的条件。
-- 执行动态 SQL
EXEC sp_executesql @sql_mic;
-- 注释:执行动态构建的 SQL 查询语句。
)
--———————————————————————————————— 连接 ————————————————————————————————————————————
-- 构建动态 SQL
DECLARE @startDate int = 1;
DECLARE @endDate int = DAY(@previousDate);
SET @sql_mic = N'select mic_FinalResult.[营运区], mic_FinalResult.[大区],mic_FinalResult.[公斤段],
mac_FinalResult.[9月日均重量],mac_FinalResult.[10月日均重量],mac_FinalResult.[环比增长],mac_FinalResult.[对比月份]';
-- 注释:声明两个整数变量@startDate 和@endDate,@startDate 初始化为 1,@endDate 设置为前一天日期的天数部分。接着初始化动态 SQL 变量@sql_mic,开始构建查询语句的开头部分,选择营运区、大区、公斤段和对比月份这几个列。
WHILE @startDate <= @endDate
BEGIN
SET @sql_mic = @sql_mic + N', ISNULL(MAX(CASE WHEN 日期 = ''' + CAST(@startDate AS nvarchar(10)) + N''' THEN 结算重量 END), 0) AS [' + CAST(@startDate AS nvarchar(10)) + N' 号]';
SET @startDate = @startDate + 1;
END;
-- 注释:这是一个循环,在循环中动态构建查询语句,对于每个日期从 1 到前一天的天数,使用 MAX 和 CASE WHEN 语句来确定结算重量,并使用 ISNULL 函数将 NULL值转换为 0,然后将结果作为一个新的列添加到查询语句中,列名为[X 号],X 是当前日期的值。
SET @sql_mic = @sql_mic + N' FROM mic_FinalResult left join mac_FinalResult on (mic_FinalResult.[营运区]=mac_FinalResult.[营运区] and mic_FinalResult.[大区]=mac_FinalResult.[寄件区域] and mic_FinalResult.[公斤段]=mac_FinalResult.[公斤段]
GROUP BY mic_FinalResult.[营运区], mic_FinalResult.[大区],mic_FinalResult.[公斤段],mac_FinalResult.[对比月份]
ORDER BY mic_FinalResult.[营运区], mic_FinalResult.[大区],';
SET @sql_mic = @sql_mic + N' CASE mic_FinalResult.[公斤段] WHEN ''0-70kg'' THEN 1 WHEN ''70-300kg'' THEN 2 WHEN ''300-500kg'' THEN 3 WHEN ''500-800kg'' THEN 4 WHEN ''800-1500kg'' THEN 5 WHEN ''1500-3000kg'' THEN 6 WHEN ''3000kg以上'' THEN 7 ELSE 8 END,';
SET @sql_mic = @sql_mic + N' CASE mac_FinalResult.[对比月份] WHEN ''9月结'' THEN 1 WHEN ''10月结'' THEN 2 ELSE 3 END';
-- 注释:在循环结束后,继续向动态 SQL 变量添加查询语句的剩余部分,包括从临时表#bbbb 中选取数据、按照营运区、大区、公斤段和对比月份进行分组,以及按照公斤段和对比月份进行排序的条件。
-- 执行动态 SQL
EXEC sp_executesql @sql_mic;
-- 注释:执行动态构建的 SQL 查询语句。
