专业的JAVA编程教程与资源

网站首页 > java教程 正文

SQL查询(按部门、申请人排序并生成序号

temp10 2025-09-12 03:06:01 java教程 4 ℃ 0 评论

优化说明

1. 调整主查询排序逻辑:将原有的 `SortOrder → 申请人 → 成本中心2` 调整为 `SortOrder → 部门(成本中心2)→ 申请人`,确保先按部门分组,再按申请人排序。

SQL查询(按部门、申请人排序并生成序号

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(核定金额 * 汇率)` 并按币种分组(需额外汇率表支持)。


通过以上调整,查询结果将严格按 部门→申请人 排序,序号同步反映该顺序,满足业务需求。

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

欢迎 发表评论:

最近发表
标签列表