MySQL和Hive中的行转列、列转行

水善利万物而不争,处众人之所恶,故几于道💦

文章目录

    • MySQL
      • 1.行转列
      • 2.列转行
    • Hive
      • 1.行转列
      • 2.列转行
        • (1)侧窗
        • (2)union

MySQL

1.行转列

把多行转成列。直接group,sum(if())
在这里插入图片描述
在这里插入图片描述

2.列转行

在这里插入图片描述
在这里插入图片描述

Hive

1.行转列

在这里插入图片描述

select 
	name,
	sum(if(km='shuxue',cj,0)) shuxue,
	sum(if(km='yuwen',cj,0)) yuwen,
	sum(if(km='huaxue',cj,0)) huaxue 
from hzl 
group by name

在这里插入图片描述

2.列转行

(1)侧窗

hive中除了可以用常规的union all 外,还可以用侧窗
在这里插入图片描述

-- 侧窗写法
select 
	name,
	km,
	cj 
from lzh2 
	lateral view 
	explode(map('yuwen',yuwen,'shuxue',shuxue,'huaxue',huaxue)) tmp as km,cj;

在这里插入图片描述

(2)union
-- 常规写法
select name,'shuxue' km,shuxue cj from lzh2 
union all 
select name,'yuwen',yuwen from lzh2 
union all 
select name,'huaxue',huaxue from lzh2;

在这里插入图片描述

### 关于行转列转行的函数用法或实现方法 #### 1. **行转列** 行转列是指将表中的某些数据转化为的形式展示。以下是几种常见的实现方式及其示例: - **MySQL 中使用 `GROUP_CONCAT` 函数** MySQL 提供了 `GROUP_CONCAT()` 函数来合并多的数据为单显示,通常用于简单的行转列操作[^2]。 ```sql SELECT id, GROUP_CONCAT(name SEPARATOR ',') AS names FROM users GROUP BY id; ``` - **Oracle 或其他数据库中使用 `PIVOT` 方法** Oracle 数据库支持直接通过 `PIVOT` 子句完成复杂的行转列操作[^1]。 ```sql SELECT * FROM ( SELECT name, subject, score FROM student_scores ) PIVOT ( SUM(score) FOR subject IN ('语文', '数学', '英语') ); ``` - **SQL Server 使用 `CASE WHEN` 结合聚合函数** SQL Server 支持通过 `MAX(CASE WHEN ...)` 的形式手动实现行转列功能[^4]。 ```sql SELECT name, MAX(CASE WHEN subject = '语文' THEN score ELSE NULL END) AS "语文", MAX(CASE WHEN subject = '数学' THEN score ELSE NULL END) AS "数学", MAX(CASE WHEN subject = '英语' THEN score ELSE NULL END) AS "英语" FROM student_scores GROUP BY name; ``` --- #### 2. **转行** 转行则是指将表中的某些数据转化为的形式展示。以下是几种常见的方式: - **MySQL 中使用 `UNION ALL` 方法** 在 MySQL 中可以通过多次调用 `SELECT` 并结合 `UNION ALL` 来实现转行的功能[^2]。 ```sql SELECT '语文' AS subject, chinese_score AS score FROM students UNION ALL SELECT '数学' AS subject, math_score AS score FROM students UNION ALL SELECT '英语' AS subject, english_score AS score FROM students; ``` - **SQL Server 中使用 `UNPIVOT` 方法** SQL Server 提供了专门的 `UNPIVOT` 子句来进转行的操作[^4]。 ```sql SELECT name, subject, score FROM ( SELECT name, chinese_score, math_score, english_score FROM student_scores ) unpvt UNPIVOT ( score FOR subject IN (chinese_score, math_score, english_score) ) as upvt; ``` - **Hive 中使用 `LATERAL VIEW EXPLODE` 方法** Hive 支持通过 `EXPLODE` 函数配合 `LATERAL VIEW` 将数组类型的展开成多数据[^3]。 ```sql SELECT id, industry FROM user_industries LATERAL VIEW explode(industry_list) exploded_table AS industry; ``` --- #### 总结 不同的数据库系统提供了多种工具技术来解决行转列转行的问题。具体选择哪种方式取决于所使用的数据库类型以及实际需求场景。对于复杂业务逻辑,建议优先考虑内置函数(如 `PIVOT`, `UNPIVOT`, `GROUP_CONCAT` 等),因为它们能够显著提高性能并减少开发成本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿年、嗯啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值