SQLServer行列转换:PIVOT与UNPIVOT实战

需积分: 8 3 下载量 122 浏览量 更新于2024-09-08 收藏 25KB DOCX 举报
"SQL语句大全,包含了SQLServer中行列转换的Pivot和UnPivot操作,适用于解决日常的SQL问题。" 在SQL语言中,处理数据的行列转换是非常常见的需求,特别是当你需要将某一列的数据作为新的列名或者将多列数据合并到一行时。SQLServer提供了Pivot和UnPivot这两个功能,分别用于实现行转列和列转行的操作。 1. **行转列(Pivot)** 行转列是将原本表中的行数据转换成列数据。在SQLServer 2000中,可以通过聚合函数配合CASE语句来实现。而在SQLServer 2005及更高版本中,引入了PIVOT关键字,使得这个操作更为简洁。例如,我们有一个包含学生姓名、课程和分数的表格,我们想要将课程列的值转换为列名,显示每个学生的各科成绩: ```sql SELECT 姓名, MAX(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 END) AS 语文, MAX(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 END) AS 数学, MAX(CASE 课程 WHEN '物理' THEN 分数 ELSE 0 END) AS 物理 FROM tb GROUP BY 姓名 ``` 上述SQL语句会将原始表格中的课程列转换为三个列(语文、数学、物理),并显示每个学生在这些科目上的得分。 2. **列转行(UnPivot)** 相反地,列转行是将列数据转换为行数据。在SQLServer 2000中,可以使用UNION操作来完成。在SQLServer 2005中,引入了UNPIVOT关键字。例如,如果我们想要把上面转换后的表格恢复为原始的行格式: ```sql SELECT 姓名, 课程, 分数 FROM ( SELECT 姓名, '语文' AS 课程, 语文 AS 分数 FROM tb_pivot UNION ALL SELECT 姓名, '数学' AS 课程, 数学 AS 分数 FROM tb_pivot UNION ALL SELECT 姓名, '物理' AS 课程, 物理 AS 分数 FROM tb_pivot ) AS unpvt ``` 这个操作将把之前行转列得到的表格恢复为原始的姓名、课程和分数的格式。 3. **兼容性问题** 需要注意的是,PIVOT和UNPIVOT是SQLServer 2005及更高版本的语法特性,如果在旧版本的数据库中使用,可能需要调整数据库的兼容级别至90或以上。在数据库属性中,可以通过选择“选项”->“兼容级别”来更改。 掌握Pivot和UnPivot操作对于处理复杂的报表和数据分析非常有帮助,它们能够使你更灵活地组织和展示数据,从而更好地满足业务需求。在实际应用中,可以根据具体的数据结构和需求,灵活运用这两种技术。