Oracle MySQL sql 行转列 case when结合group by加sum聚合函数

该方法比较通用,可以适用于Oracle、MySQL、Hive,其他数据库不清楚

测试环境:Oracle

数据准备Oracle sql代码

select '123' meter_id,'2022-05-05' data_date,'1' phase_flag,'55' cur_val from dual
union all
select '123' meter_id,'2022-05-05' data_date,'2' phase_flag,'66' cur_val from dual
union all
select '123' meter_id,'2022-05-05' data_date,'3' phase_flag,'77' cur_val from dual

数据格式如下

在这里插入图片描述

行转列sql代码

select METER_ID,
	   DATA_DATE,
	   SUM(case when phase_flag = '1' then cur_val end) cur_val1,
	   SUM(case when phase_flag = '2' then cur_val end) cur_val2,
	   SUM(case when phase_flag = '3' then cur_val end) cur_val3
from 
(
select '123' meter_id,'2022-05-05' data_date,'1' phase_flag,'55' cur_val from dual
union all
select '123' meter_id,'2022-05-05' data_date,'2' phase_flag,'66' cur_val from dual
union all
select '123' meter_id,'2022-05-05' data_date,'3' phase_flag,'77' cur_val from dual)
group by METER_ID,data_date

行转列后数据格式

在这里插入图片描述

下面链接有更多的办法,但是本文介绍的case when方法是比较通用的一种方式。
链接

### 结合使用 CASE WHEN聚合函数SQL 查询中,`CASE WHEN` 是一种条件表达式,允许根据不同的条件返回不同的值。当它与聚合函数(如 `SUM()`、`MAX()` 或 `MIN()`)结合时,可以在复杂的数据处理场景下实现强大的功能。 #### 使用 SUM() 配合 CASE WHEN 实现行转列 通过 `CASE WHEN` 的逻辑判断和 `SUM()` 函数的累能力,可以轻松完成行到列的转换。例如,在统计不同性别员工数量的情况下: ```sql SELECT dname, SUM(CASE WHEN gender = '男' THEN 1 ELSE 0 END) AS male_count, -- 统计男性人数 SUM(CASE WHEN gender = '女' THEN 1 ELSE 0 END) AS female_count -- 统计女性人数 FROM tb_emp GROUP BY dname; ``` 上述查询会按照部门名称 (`dname`) 进行分组,并分别计算每个部门中的男女员工数[^4]。 --- #### 不同类型的聚合函数配合 CASE WHEN 除了 `SUM()` 外,还可以使用其他聚合函数来满足特定需求。以下是几个常见例子: 1. **最大值 (MAX)** 如果希望获取某一条件下某字段的最大值,则可如下编写: ```sql SELECT department_id, MAX(CASE WHEN status = 'active' THEN salary ELSE NULL END) AS max_active_salary FROM employees GROUP BY department_id; ``` 2. **最小值 (MIN)** 类似于上面的例子,如果目标是最小值则替换为 `MIN()` 即可。 ```sql SELECT department_id, MIN(CASE WHEN status = 'inactive' THEN hire_date ELSE NULL END) AS earliest_inactive_hire_date FROM employees GROUP BY department_id; ``` 3. **计数 (COUNT)** 对某些符合条件的情况进行计数也可以借助 `CASE WHEN` 完成。 ```sql SELECT category, COUNT(CASE WHEN rating >= 8 THEN id ELSE NULL END) AS high_rating_items FROM products GROUP BY category; ``` 以上这些组合方式均展示了如何灵活运用 `CASE WHEN` 来控制哪些记录参与最终的结果汇总[^1]。 --- #### 数据库兼容性说明 此方法不仅限于 MySQL ,同样适用于 Oracle 及 Hive 等多种关系型数据库管理系统。不过需要注意的是具体语法可能略有差异,请参照对应 DBMS 文档调整细节部分[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值