专业的JAVA编程教程与资源

网站首页 > java教程 正文

多种字段条件排序方案_多字段排序时排序的优先级是

temp10 2025-09-12 03:05:34 java教程 4 ℃ 0 评论

通过增加排序权重逻辑确保特殊部门按指定顺序排列,同时保持序号生成规则一致

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语句的匹配条件。

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

欢迎 发表评论:

最近发表
标签列表