网站首页 > java教程 正文
VBA SQL优化方案(兼容特殊部门排序)
优化说明
原SQL需解决 “销售部类部门排序在一起” 的问题(如东区、北区、南区、山东、西区销售部),同时保持序号生成规则不变。由于VBA SQL不支持`CASE WHEN`,采用 “辅助排序字段+简单字符串匹配” 实现,具体逻辑如下:
优化后VBA SQL代码
```sql
SELECT
(SELECT COUNT(*)
FROM (
SELECT 成本中心2 AS 部门, 收款方 AS 申请人, 单据公司, SUM(核定金额) AS 金额, 本位币
FROM [费用明细报表$]
GROUP BY 成本中心2, 收款方, 单据公司, 本位币
) AS T2
WHERE
-- 序号生成规则:按【辅助排序值】→【部门】→【申请人】排序
(T2.部门 LIKE '%销售部' AND T1.成本中心2 NOT LIKE '%销售部')
OR (T2.部门 LIKE '%销售部' AND T1.成本中心2 LIKE '%销售部' AND T2.部门 <= T1.成本中心2 AND T2.申请人 <= T1.申请人)
OR (T2.部门 NOT LIKE '%销售部' AND T1.成本中心2 NOT LIKE '%销售部' AND T2.部门 <= T1.成本中心2 AND T2.申请人 <= T1.申请人)
) AS 序号,
T1.成本中心2 AS 部门,
T1.申请人,
T1.金额,
T1.本位币 AS 币种,
T1.单据公司
FROM (
SELECT
成本中心2,
收款方 AS 申请人,
SUM(核定金额) AS 金额,
本位币,
单据公司,
-- 辅助排序字段:销售部类部门排前面(0),其他部门排后面(1)
IIF(成本中心2 LIKE '%销售部', 0, 1) AS SortGroup,
0 AS SortOrder -- 明细行标识
FROM [费用明细报表$]
GROUP BY 成本中心2, 收款方, 单据公司, 本位币
UNION ALL
SELECT
'' AS 成本中心2,
'合计' AS 申请人,
SUM(核定金额) AS 金额,
'CNY' AS 本位币,
'' AS 单据公司,
1 AS SortGroup, -- 合计行归为“其他部门”组
1 AS SortOrder -- 合计行标识(固定排最后)
FROM [费用明细报表$]
) AS T1
ORDER BY
T1.SortOrder ASC, -- 先排明细行,再排合计行
T1.SortGroup ASC, -- 销售部类部门(0)优先排序
T1.成本中心2 ASC, -- 部门内按名称排序
T1.申请人 ASC -- 申请人按名称排序
;
```
关键优化点
1. 新增辅助字段 `SortGroup`
- 用 `IIF(成本中心2 LIKE '%销售部', 0, 1)` 区分部门类型:
- `0`:含“销售部”的部门(东区、北区、南区、山东、西区销售部等),排序时优先;
- `1`:其他部门及合计行,排序靠后。
2. 序号生成规则适配
子查询 `WHERE` 条件分3种情况保证序号连续:
- 销售部类部门之间比较:`T2.部门 LIKE '%销售部' AND T1.成本中心2 LIKE '%销售部'`
- 非销售部类部门之间比较:`T2.部门 NOT LIKE '%销售部' AND T1.成本中心2 NOT LIKE '%销售部'`
- 销售部类部门与非销售部类部门比较:`T2.部门 LIKE '%销售部' AND T1.成本中心2 NOT LIKE '%销售部'`(销售部在前,序号更小)。
3. 排序逻辑
`ORDER BY` 按 `SortOrder`(明细/合计)→ `SortGroup`(销售部组/其他组)→ `成本中心2`(部门名)→ `申请人` 排序,确保销售部类部门集中显示。
VBA兼容性说明
- 避免 `CASE WHEN`,使用VBA SQL支持的 `IIF` 和 `LIKE` 实现逻辑;
- 未引入复杂函数,保持SQL简洁性,兼容Excel VBA的Jet SQL引擎。
通过以上调整,可实现 “销售部类部门排序在一起” 且序号生成规则不变的需求。
- 上一篇: SQL查询(按部门、申请人排序并生成序号
- 下一篇: 深圳尚学堂Java培训:排序方法小结-冒泡排序
猜你喜欢
- 2025-09-12 不来看,不后悔吗Java 树结构实际应用 (二叉排序树)
- 2025-09-12 深圳尚学堂Java培训:排序方法小结-冒泡排序
- 2025-09-12 SQL查询(按部门、申请人排序并生成序号
- 2025-09-12 多种字段条件排序方案_多字段排序时排序的优先级是
- 2025-09-12 Comparator.comparing排序使用示例
- 2025-09-12 深圳尚学堂Java培训:可视化排序实践之选择排序
- 2025-09-12 大厂面试必看!Java单链表排序的2种方法,附完整代码与优化思路
- 2025-09-12 深圳尚学堂Java培训:排序方法小结-选择排序
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)