SQL行转列与列转行实例解析:PIVOT vs. CASE-WHEN

需积分: 9 6 下载量 75 浏览量 更新于2024-09-15 收藏 63KB DOC 举报
在IT开发过程中,行转列和列转行操作是非常常见的数据转换需求。这两种操作的主要目的是将数据的结构从一维转换为二维,以便于分析和展示。在这个场景下,我们将讨论如何使用SQL语言中的CASE WHEN语句和SQL Server 2005的PIVOT/UNPIVOT功能来实现这两个转换。 首先,行转列(也称为展开或扁平化)通常用于汇总数据,如从多行记录中提取特定列的信息并将其显示在同一行中。例如,假设有一个包含学生姓名、科目和成绩的表格,如果想看到每位学生的所有成绩集中在一起,可以使用CASE WHEN语句来实现。以下是一个示例: ```sql SELECT UserName, 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 英语, MAX(CASE WHEN Subject = '生物' THEN Score ELSE 0 END) AS 生物 FROM dbo.StudentScores GROUP BY UserName ``` 这个查询通过CASE WHEN子句为每个科目检查是否存在成绩,如果有,则返回该科目的分数,否则设为0。GROUP BY语句则按用户名分组,将所有科目的成绩合并到一行中。 接下来是列转行,也就是所谓的透视(Pivot),这是SQL Server 2005引入的新特性。它允许我们将数据从列的形式转换为行,使得每个值变成一个单独的行,而列名则作为新行的列名。PIVOT语法如下: ```sql SELECT * FROM ( SELECT UserName, Subject, Score FROM dbo.StudentScores ) src PIVOT ( MAX(Score) FOR Subject IN ([语文], [数学], [英语], [生物]) ) AS pvt ``` 在这个PIVOT查询中,`src`是一个子查询,包含了原始数据。PIVOT关键字后面是列名列表,它们指定了想要转换为行的列。结果集会根据这些列创建新的行,原来的科目数据被移动到了新的行中,每个学生的成绩只有一行。 行转列和列转行是数据分析中处理多维度数据的重要工具。选择哪种方法取决于具体的需求和SQL版本支持。使用CASE WHEN语句虽然基础但可能效率较低,而PIVOT提供了一种更直观且效率更高的方式。掌握这两种技巧可以帮助开发者更灵活地管理数据,提高数据处理和分析的效率。