在企业级应用开发中,复杂的业务统计需求往往需要编写大量代码进行数据处理。本文将通过 Oracle 的DECODE函数与分组函数的巧妙结合,展示如何用一条 SQL 语句实现原本需要 3000 行代码的复杂计算逻辑,尤其针对企业组织架构中的部门级请假数据统计场景。
一、基础准备:构建业务数据表
1. 创建单位部门表(模拟组织架构)
CREATE TABLE t_dept (
dept_id NUMBER PRIMARY KEY, -- 部门ID(主键)
dept_name VARCHAR2(50) NOT NULL, -- 部门名称
parent_dept_id NUMBER, -- 上级部门ID(根部门为0)
create_time DATE DEFAULT SYSDATE -- 创建时间
);
-- 插入示例数据(三级部门架构)
INSERT INTO t_dept (dept_id, dept_name, parent_dept_id) VALUES (1, '集团总部', 0);
INSERT INTO t_dept (dept_id, dept_name, parent_dept_id) VALUES (2, '技术研发部', 1);
INSERT INTO t_dept (dept_id, dept_name, parent_dept_id) VALUES (3, '产品运营部', 1);
INSERT INTO t_dept (dept_id, dept_name, parent_dept_id) VALUES (4, '后端开发组', 2);
INSERT INTO t_dept (dept_id, dept_name, parent_dept_id) VALUES (5, '前端开发组', 2);
2. 创建人员请假信息表
CREATE TABLE t_leave (
user_id VARCHAR2(20) PRIMARY KEY, -- 人员账号(主键)
user_name VARCHAR2(30) NOT NULL, -- 人员姓名
dept_id NUMBER NOT NULL, -- 所属部门ID
leave_days NUMBER(5,1), -- 请假天数(保留1位小数)
leave_type VARCHAR2(20), -- 请假类型(年假/事假/病假等)
leave_status VARCHAR2(10), -- 请假状态('完成'/'进行中')
apply_time DATE DEFAULT SYSDATE -- 申请时间
);
-- 插入模拟数据(覆盖不同部门/类型/状态)
INSERT INTO t_leave VALUES
('U001', '张三', 4, 3.5, '年假', '完成', TO_DATE('2025-06-01', 'YYYY-MM-DD')),
('U002', '李四', 5, 2.0, '事假', '进行中', TO_DATE('2025-06-10', 'YYYY