行转列和列转行函数
时间: 2025-04-07 19:06:33 浏览: 43
### 行转列与列转行的概念
在SQL中,行转列(Pivot)和列转行(Unpivot)是非常重要的数据处理技术。它们用于将数据从一种结构转换为另一种结构。
#### 行转列(Pivot)
行转列是指将多行的数据汇总并转化为单行或多行的多个字段的过程。这种操作通常通过聚合函数(如 `MAX` 或 `SUM`)以及条件表达式来实现[^2]。
以下是基于通用数据库语法的一个典型例子:
```sql
SELECT
name,
MAX(CASE WHEN subject = '语文' THEN score ELSE 0 END) AS "语文",
MAX(CASE WHEN subject = '数学' THEN score ELSE 0 END) AS "数学",
MAX(CASE WHEN subject = '英语' THEN score ELSE 0 END) AS "英语"
FROM student
GROUP BY name;
```
此查询的作用是从原始表格中提取每位学生的成绩,并将其按科目展开到不同的列上。
---
#### 列转行(Unpivot)
列转行则是指将宽表中的多个列压缩成若干行的操作。这一过程可以利用特定的 SQL 函数完成,在某些数据库管理系统中提供了专门的支持,比如 Oracle 的 UNPIVOT 子句或者标准 SQL 中的手动实现方式[^1]。
下面是一个手动实现的例子:
假设有一个学生分数表如下所示:
| name | Chinese | Math | English |
|------|---------|------|----------|
| Tom | 89 | 76 | 92 |
如果希望将其转换成长表形式,则可以通过以下语句达成目标:
```sql
SELECT
name,
subject,
value
FROM (
SELECT
name,
CAST(Chinese AS VARCHAR(10)) AS chinese_val,
CAST(Math AS VARCHAR(10)) AS math_val,
CAST(English AS VARCHAR(10)) AS english_val
FROM scores
) src
UNPIVOT (
value FOR subject IN (chinese_val, math_val, english_val)
) unpvt;
```
上述代码片段展示了如何使用 `UNPIVOT` 将固定数量的列映射至动态生成的结果集中。
对于不支持内置 Unpivot 功能的关系型数据库而言,也可以借助联合查询的方式模拟该效果:
```sql
SELECT name, 'Chinese' as Subject, Chinese as Score FROM Scores
UNION ALL
SELECT name, 'Math', Math FROM Scores
UNION ALL
SELECT name, 'English', English FROM Scores;
```
这种方法虽然稍显冗长,但在跨平台兼容性和灵活性方面具有优势。
---
### JSON 函数的应用场景
除了传统的 Pivot 和 Unpivot 方法外,现代关系型数据库还引入了JSON类型的存储能力,允许开发者更加灵活地表示嵌套或半结构化数据。例如 PostgreSQL 提供了一系列强大的工具集用来解析/构建复杂的对象模型;而 MySQL 自版本5.7起也增加了对原生 json 类型的支持。
当面对复杂层次化的业务需求时,考虑采用这些高级特性往往能够显著简化开发流程并提升性能表现。
---
阅读全文
相关推荐

















