oracle用sql语句实现年龄分段统计,case when then用法(用于分类统计)

博客介绍了使用SQL对一张表按不同条件进行多次统计,提到使用case when then进行分类统计。因数据库无年龄字段,给出通过获取当年年份减去出生年计算年龄的写法,即(select to_number(to_char(sysdate, ‘yyyy’ )) from dual) - substr(csny,0,4) as age。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sql 对一张表进行按照不同条件进行多次统计
在这里使用 case when then(多用于分类统计)

SELECT
	CASE
WHEN age < 30 THEN
	'30岁以下'
WHEN age BETWEEN 30
AND 35 THEN
	'30-35岁'
WHEN age BETWEEN 36
AND 40 THEN
	'36-40岁'
WHEN age > 40 THEN
	'40岁以上'
END AS NAME,
 count(*) AS count
FROM
	(
		SELECT
			(
				SELECT
					to_number (to_char(sysdate, 'yyyy'))
				FROM
					DUAL
			) - substr(csny, 0, 4) AS age
		FROM
			t_xwr_lz_grxx b,
			t_xwr_sys_user c,
			t_xwr_sys_dept d
		WHERE
			b.xm = c.user_id
		AND c.dept_id = d.dept_id
		AND (
			SELECT
				to_number (to_char(sysdate, 'yyyy'))
			FROM
				DUAL
		) - substr(csny, 0, 4) IS NOT NULL
	)
GROUP BY
	CASE
WHEN age < 30 THEN
	'30岁以下'
WHEN age BETWEEN 30
AND 35 THEN
	'30-35岁'
WHEN age BETWEEN 36
AND 40 THEN
	'36-40岁'
WHEN age > 40 THEN
	'40岁以上'
END;

解释以下:

由于数据库里没有年龄字段,这里只能由 获取当年年份 - 出生年
所有有了这个写法: 当年年份 - 出生年
(select to_number(to_char(sysdate, ‘yyyy’ )) from dual) - substr(csny,0,4) as age

结果如下所示
在这里插入图片描述

Oracle SQL 中,`CASE WHEN` 语句是一种条件表达式,用于根据不同的条件返回不同的值。它可以在 `SELECT`、`WHERE`、`ORDER BY` 等子句中使用,也可以嵌套在其他表达式中,从而增强 SQL 的灵活性和可读性。 ### 基本语法结构 ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END ``` 其中: - `condition` 是判断条件,通常为布尔表达式。 - `result` 是当对应条件成立时返回的值。 - `ELSE` 子句是可选的,用于处理没有满足任何条件的情况,默认为 `NULL`,但在 PL/SQL 中会报错。 ### 使用场景及示例 #### 在 SELECT 子句中的应用 以下示例展示如何在 `SELECT` 语句中使用 `CASE WHEN` 对员工的薪资进行分类: ```sql SELECT employee_id, salary, CASE WHEN salary < 3000 THEN 'Low' WHEN salary BETWEEN 3000 AND 7000 THEN 'Medium' WHEN salary > 7000 THEN 'High' ELSE 'Unknown' END AS salary_level FROM employees; ``` 上述查询将根据 `salary` 字段的值返回一个描述性的薪资等级,例如 `'Low'`、`'Medium'` 或 `'High'` [^1]。 #### 在 WHERE 子句中的应用 `CASE WHEN` 可以用作动态过滤数据的工具。例如,根据某个参数的值来决定过滤条件: ```sql SELECT * FROM employees WHERE CASE WHEN department_id = 10 THEN 'Finance' WHEN department_id = 20 THEN 'HR' ELSE 'Other' END = 'HR'; ``` 此查询将仅返回部门编号为 20 的员工记录 [^1]。 #### 处理未匹配情况 如果省略 `ELSE` 子句且没有任何条件匹配,则在 SQL 查询中会返回 `NULL`,而在 PL/SQL 中会抛出错误(如 ORA-06592)[^2]。因此,在实际开发中建议始终包含 `ELSE` 分支以避免意外行为。 #### 与 DECODE 函数对比 虽然 `DECODE` 函数可以实现简单的条件判断,但其语法较为局限,只能处理等值比较。相比之下,`CASE WHEN` 支持更复杂的逻辑判断,包括范围比较和组合条件。 例如,使用 `DECODE` 实现职位映射: ```sql SELECT job_id, DECODE(job_id, 'AD_PRES', 'A', 'ST_MAN', 'B', 'IT_PROG', 'C', 'SA_REP', 'D', 'ST_CLERK', 'E') AS JOB FROM employees; ``` 而 `CASE WHEN` 可以支持更灵活的条件判断,例如结合 `LIKE`、`BETWEEN` 等操作符 [^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值