通过增加排序权重逻辑确保特殊部门按指定顺序排列,同时保持序号生成规则一致
SELECT
(SELECT COUNT(*)
FROM (
SELECT
成本中心2,
收款方,
单据公司,
SUM(核定金额) AS 金额,
本位币,
CASE
WHEN 成本中心2 IN ('东区销售部', '北区销售部', '南区销售部', '山东销售部', '西区销售部') THEN
CASE 成本中心2
WHEN '东区销售部' THEN 1
WHEN '北区销售部' THEN 2
WHEN '南区销售部' THEN 3
WHEN '山东销售部' THEN 4
WHEN '西区销售部' THEN 5
END
ELSE 99
END AS 排序权重
FROM [费用明细报表$]
GROUP BY 成本中心2, 收款方, 单据公司, 本位币
) AS T2
WHERE
(T2.排序权重 < T1.排序权重)
OR (T2.排序权重 = T1.排序权重 AND T2.成本中心2 < T1.成本中心2)
OR (T2.排序权重 = T1.排序权重 AND T2.成本中心2 = T1.成本中心2 AND T2.申请人 <= T1.申请人)
) AS 序号,
T1.成本中心2 AS 部门,
T1.申请人,
T1.金额,
T1.本位币 AS 币种,
T1.单据公司
FROM (
SELECT
成本中心2,
收款方 AS 申请人,
SUM(核定金额) AS 金额,
本位币,
单据公司,
0 AS SortOrder,
CASE
WHEN 成本中心2 IN ('东区销售部', '北区销售部', '南区销售部', '山东销售部', '西区销售部') THEN
CASE 成本中心2
WHEN '东区销售部' THEN 1
WHEN '北区销售部' THEN 2
WHEN '南区销售部' THEN 3
WHEN '山东销售部' THEN 4
WHEN '西区销售部' THEN 5
END
ELSE 99
END AS 排序权重
FROM [费用明细报表$]
GROUP BY 成本中心2, 收款方, 单据公司, 本位币
UNION ALL
SELECT
'' AS 成本中心2,
'合计' AS 申请人,
SUM(核定金额) AS 金额,
'CNY' AS 本位币,
'' AS 单据公司,
1 AS SortOrder,
99 AS 排序权重
FROM [费用明细报表$]
) AS T1
ORDER BY
T1.SortOrder ASC,
T1.排序权重 ASC,
T1.成本中心2 ASC,
T1.申请人 ASC
```
优化说明:
1. 排序权重逻辑:
- 为特殊部门(东/北/南/山东/西区销售部)分配1-5的排序权重
- 其他部门默认99权重
- 合计行保留99权重
2. 序号生成优化:
- 在T2子查询中增加排序权重字段
- 修改序号计算条件为:先比较权重 → 再比较部门名称 → 最后比较申请人
3. 结果排序规则:
- 保持SortOrder优先级(普通数据先于合计)
- 按权重排序特殊部门 → 按字母顺序排序其他部门
- 申请人保持原有排序规则
4. VBA兼容性:
- 使用CASE语句实现复杂排序逻辑
- 保留原始UNION ALL结构
- 通过字段别名保持原有输出结构
执行效果:
1. 特殊部门按东→北→南→山东→西顺序排列
2. 其他部门按字母顺序排列
3. 合计行始终位于最后
4. 序号生成规则保持连续性
5. 申请人字段在同部门内保持原有排序规则
建议在实际数据中测试排序权重分配逻辑,根据实际部门名称调整CASE语句的匹配条件。