sql如何实现行列转换

发布时间:2022-03-21 13:49:38 作者:小新
来源:亿速云 阅读:1197
# SQL如何实现行列转换

## 一、行列转换概述

行列转换(Pivot/Unpivot)是SQL中常见的数据重塑操作,主要用于以下场景:
- **行转列(Pivot)**:将多行数据聚合为单行的多个列
- **列转行(Unpivot)**:将多列数据展开为多行记录

## 二、行转列实现方案

### 1. 使用CASE WHEN + 聚合函数(通用方案)

```sql
SELECT 
    id,
    MAX(CASE WHEN subject = '数学' THEN score END) AS math_score,
    MAX(CASE WHEN subject = '语文' THEN score END) AS chinese_score,
    MAX(CASE WHEN subject = '英语' THEN score END) AS english_score
FROM student_scores
GROUP BY id;

2. 使用PIVOT语法(SQL Server/Oracle)

SELECT * FROM (
    SELECT id, subject, score 
    FROM student_scores
) AS src
PIVOT (
    MAX(score) FOR subject IN ([数学], [语文], [英语])
) AS pvt;

3. MySQL动态行转列

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
    CONCAT('MAX(CASE WHEN subject = ''', subject, 
           ''' THEN score END) AS ', subject, '_score')
) INTO @sql
FROM student_scores;

SET @sql = CONCAT('SELECT id, ', @sql, 
                  ' FROM student_scores GROUP BY id');
PREPARE stmt FROM @sql;
EXECUTE stmt;

三、列转行实现方案

1. 使用UNION ALL

SELECT id, '数学' AS subject, math_score AS score FROM student_scores
UNION ALL
SELECT id, '语文' AS subject, chinese_score AS score FROM student_scores
UNION ALL
SELECT id, '英语' AS subject, english_score AS score FROM student_scores;

2. 使用UNPIVOT语法(SQL Server/Oracle)

SELECT id, subject, score
FROM student_scores
UNPIVOT (
    score FOR subject IN (math_score, chinese_score, english_score)
) AS unpvt;

四、注意事项

  1. 性能考虑:行列转换操作通常比较消耗资源,大数据量时需谨慎使用
  2. 动态列处理:大多数数据库需要动态SQL处理不确定的列值
  3. NULL值处理:转换过程中需要注意NULL值的处理逻辑
  4. 跨数据库兼容性:不同数据库语法差异较大

五、实际应用场景

  1. 报表生成时将明细数据转为汇总格式
  2. ETL过程中数据格式转换
  3. 数据可视化前的数据预处理
  4. 异构系统数据对接时的格式转换

行列转换是SQL高级查询的重要技术,掌握后可以显著提高数据处理灵活性。 “`

推荐阅读:
  1. oracle行列转换
  2. 行列转换_wmsys.wm_concat

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sql

上一篇:js怎么用查询字符串生成路径

下一篇:sql如何使用NOT IN和SELECT TOP分页语句形式

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》