专业的JAVA编程教程与资源

网站首页 > java教程 正文

vba iif特殊部门排序方案_vba 特殊符号

temp10 2025-09-12 03:06:13 java教程 3 ℃ 0 评论

VBA SQL优化方案(兼容特殊部门排序)


vba iif特殊部门排序方案_vba 特殊符号

优化说明

原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引擎。


通过以上调整,可实现 “销售部类部门排序在一起” 且序号生成规则不变的需求。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表