网站首页 > java教程 正文
优化说明
1. 调整主查询排序逻辑:将原有的 `SortOrder → 申请人 → 成本中心2` 调整为 `SortOrder → 部门(成本中心2)→ 申请人`,确保先按部门分组,再按申请人排序。
2. 优化序号生成逻辑:序号生成子查询同步采用 `部门(成本中心2)→ 申请人` 的排序规则,实现序号按部门内申请人顺序递增。
3. 统一合计行处理:保留合计行(`SortOrder=1`)并置于结果集末尾,不参与序号计算(序号为 `NULL` 或保持原逻辑)。
优化后的SQL代码
```sql
SELECT
-- 生成序号:按部门(成本中心2)升序、申请人升序排序
(SELECT COUNT(*)
FROM (
SELECT 成本中心2 AS 部门, 收款方 AS 申请人, 单据公司, SUM(核定金额) AS 金额, 本位币
FROM [费用明细报表$]
GROUP BY 成本中心2, 收款方, 单据公司, 本位币
) AS T2
-- 序号计算条件:部门优先排序,再按申请人排序
WHERE
-- 核心:T2的部门 <= 当前行部门,且部门相同时T2的申请人 <= 当前行申请人
(T2.部门 < T1.部门)
OR (T2.部门 = T1.部门 AND T2.申请人 <= T1.申请人)
) AS 序号,
T1.成本中心2 AS 部门,
T1.申请人,
T1.金额,
T1.本位币 AS 币种,
T1.单据公司
FROM (
-- 主数据:按部门、申请人分组统计
SELECT
成本中心2,
收款方 AS 申请人,
SUM(核定金额) AS 金额,
本位币,
单据公司,
0 AS SortOrder -- 明细行标记(排在合计行前)
FROM [费用明细报表$]
GROUP BY 成本中心2, 收款方, 单据公司, 本位币
UNION ALL
-- 合计行:单独统计总金额,置于结果集末尾
SELECT
'' AS 成本中心2,
'合计' AS 申请人,
SUM(核定金额) AS 金额,
'CNY' AS 本位币,
'' AS 单据公司,
1 AS SortOrder -- 合计行标记(排在明细行后)
FROM [费用明细报表$]
) AS T1
-- 主查询排序:先排明细/合计,再按部门、申请人升序
ORDER BY
T1.SortOrder ASC, -- 确保合计行在最后
T1.成本中心2 ASC, -- 按部门升序(核心调整)
T1.申请人 ASC -- 部门内按申请人升序(核心调整)
```
关键优化点解析
1. 主查询排序
- `ORDER BY` 子句调整为 `SortOrder → 成本中心2(部门)→ 申请人`,确保结果集先按部门分组,同一部门内按申请人排序。
2. 序号生成逻辑
- 子查询 `T2` 中,通过 `(T2.部门 < T1.部门) OR (T2.部门 = T1.部门 AND T2.申请人 <= T1.申请人)` 实现序号按 部门升序、部门内申请人升序 累计计数,例如:
- 部门A的申请人按顺序生成序号1、2、3...
- 部门B的申请人从新序号开始(如4、5...)。
3. 合计行处理
- 合计行 `SortOrder=1`,确保在所有明细行之后;部门和单据公司为空,不影响排序逻辑。
最终输出SQL
```sql
SELECT
(SELECT COUNT(*)
FROM (
SELECT 成本中心2 AS 部门, 收款方 AS 申请人, 单据公司, SUM(核定金额) AS 金额, 本位币
FROM [费用明细报表$]
GROUP BY 成本中心2, 收款方, 单据公司, 本位币
) AS T2
WHERE (T2.部门 < T1.成本中心2) OR (T2.部门 = T1.成本中心2 AND T2.申请人 <= T1.申请人)
) AS 序号,
T1.成本中心2 AS 部门,
T1.申请人,
T1.金额,
T1.本位币 AS 币种,
T1.单据公司
FROM (
SELECT
成本中心2,
收款方 AS 申请人,
SUM(核定金额) AS 金额,
本位币,
单据公司,
0 AS SortOrder
FROM [费用明细报表$]
GROUP BY 成本中心2, 收款方, 单据公司, 本位币
UNION ALL
SELECT
'' AS 成本中心2,
'合计' AS 申请人,
SUM(核定金额) AS 金额,
'CNY' AS 本位币,
'' AS 单据公司,
1 AS SortOrder
FROM [费用明细报表$]
) AS T1
ORDER BY
T1.SortOrder ASC,
T1.成本中心2 ASC,
T1.申请人 ASC
```
注意事项
- 若 `成本中心2` 存在空值或重复值,需确保数据清洗后再使用(如统一部门名称格式)。
- 合计行的 `本位币` 固定为 `CNY`,若需按原数据币种汇总,可调整为 `SUM(核定金额 * 汇率)` 并按币种分组(需额外汇率表支持)。
通过以上调整,查询结果将严格按 部门→申请人 排序,序号同步反映该顺序,满足业务需求。
猜你喜欢
- 2025-09-12 不来看,不后悔吗Java 树结构实际应用 (二叉排序树)
- 2025-09-12 深圳尚学堂Java培训:排序方法小结-冒泡排序
- 2025-09-12 vba iif特殊部门排序方案_vba 特殊符号
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)