CASE WHEN与MAX的联合使用

本文介绍了如何将CASE WHEN语句与MAX函数联合使用,以处理非数值类型的数据。通过两个示例展示了在SQL查询中如何根据日期提取特定列的最大值,从而将纵行数据合并到横行。这两个示例分别使用了DECODE和CASE WHEN,配合MAX避免了返回多行结果的情况。

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

CASE WHEN...THEN与DECODE用了这长时间,一直以为case when只能单独使用或与sum一起使用,在测试一个将纵行数据合并到模行时,去发现该行数据并非是数值类型.

在网上搜索了很多却没有发现与非数值型联合使用的情况,但这并非难事,只要与MAX一起使用即可.

下面举二种类型的例子:

例1: DECODE与MAX的联合使用

SELECT DISTINCT EMP_NO,MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'01',CARD_FREQUENCY)) D01,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'02',CARD_FREQUENCY)) D02,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'03',CARD_FREQUENCY)) D03,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'04',CARD_FREQUENCY)) D04,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'05',CARD_FREQUENCY)) D05,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'06',CARD_FREQUENCY)) D06,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'07',CARD_FREQUENCY)) D07,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'08',CARD_FREQUENCY)) D08,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'09',CARD_FREQUENCY)) D09,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'10',CARD_FREQUENCY)) D10,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'11',CARD_FREQUENCY)) D11,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'12',CARD_FREQUENCY)) D12,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'13',CARD_FREQUENCY)) D13,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'14',CARD_FREQUENCY)) D14,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'15',CARD_FREQUENCY)) D15,
MAX(DECODE(TO_CHAR(WORK_DATE,'DD'),'16',CARD_FREQUENCY)) D16
FROM HRA_READ_CARD_MONTH
WHERE EMP_NO='090641' AND TO_CHAR(WORK_DATE,'YYYY/MM')='2009/03'
GROUP BY EMP_NO

 

例2:CASE WHEN与MAX的联合使用

select emp_no,max(case work_date when to_date('2009-03-01','yyyy-mm-dd') then card_frequency end) AS D01,
max(case work_date when to_date('2009-03-02','yyyy-mm-dd') then card_frequency end) AS D02,
max(case work_date when to_date('2009-03-03','yyyy-mm-dd') then card_frequency end) AS D03,
max(case work_date when to_date('2009-03-04','yyyy-mm-dd') then card_frequency end) AS D04,
max(case work_date when to_date('2009-03-05','yyyy-mm-dd') then card_frequency end) AS D05,
max(case work_date when to_date('2009-03-06','yyyy-mm-dd') then card_frequency end) AS D06,
max(case work_date when to_date('2009-03-07','yyyy-mm-dd') then card_frequency end) AS D07,
max(case work_date when to_date('2009-03-08','yyyy-mm-dd') then card_frequency end) AS D08,
max(case work_date when to_date('2009-03-09','yyyy-mm-dd') then card_frequency end) AS D09,
max(case work_date when to_date('2009-03-10','yyyy-mm-dd') then card_frequency end) AS D10,
max(case work_date when to_date('2009-03-11','yyyy-mm-dd') then card_frequency end) AS D11,
max(case work_date when to_date('2009-03-12','yyyy-mm-dd') then card_frequency end) AS D12,
max(case work_date when to_date('2009-03-13','yyyy-mm-dd') then card_frequency end) AS D13,
max(case work_date when to_date('2009-03-14','yyyy-mm-dd') then card_frequency end) AS D14,
max(case work_date when to_date('2009-03-15','yyyy-mm-dd') then card_frequency end) AS D15,
max(case work_date when to_date('2009-03-16','yyyy-mm-dd') then card_frequency end) AS D16
 from HRA_READ_CARD_MONTH where emp_no='090461'
 group by emp_no;

其实例1和例2不同之处在于DECODE与CASE WHEN语法的运用,再者就是日期放置位置的不同.两者如果去掉MAX就会出现多行显示的情况,结果是一样的,在此不再累述.

 

 

<think>好的,用户需要了解如何在SQL中结合使用CASE WHENMAX函数。首先,我要回忆一下这两个函数的用法。MAX是聚合函数,用于返回某列的最大值,而CASE WHEN用于条件判断,生成不同的结果。 接下来,我需要考虑如何将它们结合起来。可能的场景包括根据某个条件动态选择要取最大值的列,或者在计算最大值时加入条件过滤。例如,在分组查询中,对不同的组应用不同的条件来求最大值。 然后,我需要查找相关的示例。根据用户提供的引用,特别是引用[1]提到了MAX()函数的使用示例,虽然具体内容没有详细展开,但可以推断出一些常见的用法。此外,引用[3]讨论了VARCHAR(MAX)的处理方式,虽然问题不直接相关,但可能需要注意数据类型的影响。 接下来,构造几个例子。比如,在一个销售表中,根据不同地区计算最高销售额,或者根据产品类别动态选择计算最大值的字段。同时,需要注意SQL语法是否正确,比如CASE WHEN的位置是否在MAX函数内部,或者是否在外部作为条件。 还要考虑用户可能的实际应用场景,比如数据报表中的动态统计,或者在数据分析时根据不同条件筛选最大值。需要确保示例简洁明了,并且覆盖常见的使用情况。 另外,用户可能遇到的问题包括语法错误或逻辑错误,比如在CASE WHEN中没有正确结束END,或者在聚合函数中的条件范围不正确。需要提醒用户注意这些陷阱,并参考引用[5]中提到的关键字冲突问题,虽然这里可能不涉及,但保持警惕是好的。 最后,生成相关问题,帮助用户进一步学习,比如优化技巧、性能比较或处理多条件的情况。这些问题应基于常见的进阶使用场景,确保用户能够深入理解。</think>### SQL中CASE WHENMAX函数结合使用示例 #### 1. 基础场景:根据条件计算不同分组的最大值 假设有一个销售表`sales`,包含产品类别`category`、销售额`amount`季度`quarter`字段。需要按季度统计每个类别的最大销售额,但针对电子产品(`category='electronics'`)单独标注其最大值是否超过10000: ```sql SELECT quarter, MAX(CASE WHEN category = 'electronics' THEN amount ELSE 0 END) AS max_electronics, CASE WHEN MAX(CASE WHEN category = 'electronics' THEN amount END) > 10000 THEN '达标' ELSE '未达标' END AS status FROM sales GROUP BY quarter; ``` 此查询通过嵌套`CASE WHEN`实现: - 内层`CASE WHEN`筛选电子产品的销售额,非电子产品返回0 - 外层`CASE WHEN`基于最大值计算结果添加状态标注[^1] #### 2. 动态列选择:根据不同条件取不同列的最大值 在员工表`employees`中,若需要根据职级`level`选择工资计算方式(初级员工取`base_salary`,高级员工取`base_salary + bonus`)的最大值: ```sql SELECT department, MAX(CASE WHEN level = '初级' THEN base_salary WHEN level = '高级' THEN base_salary + bonus END) AS max_adjusted_salary FROM employees GROUP BY department; ``` 这里`CASE WHEN`表达式作为`MAX()`的参数,动态决定计算值来源[^1] #### 3. 带过滤条件的最大值计算 在订单表`orders`中统计各区域`region`的最高订单金额,但仅计算已完成订单(`status='completed'`): ```sql SELECT region, MAX(CASE WHEN status = 'completed' THEN amount ELSE NULL END) AS max_completed_amount FROM orders GROUP BY region; ``` `ELSE NULL`会自然过滤不符合条件的记录,因为`MAX()`函数自动忽略NULL值[^3] #### 4. 多条件组合判断 库存表`inventory`中需要找出每个仓库`warehouse`在有效期内的商品最高库存值,且仅统计A类商品: ```sql SELECT warehouse, MAX(CASE WHEN expiration_date > GETDATE() AND product_type = 'A' THEN stock_quantity END) AS max_valid_stock FROM inventory GROUP BY warehouse; ``` 通过`CASE WHEN`实现多条件过滤后求最大值[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值