SQL 实现类似 EXCEL 的行列转置功能 在数据库中,我们经常需要将数据从行转换为列,或者从列转换为行,这种操作称为行列转置。这种操作在 Excel 中非常常见,但是在 SQL 中实现类似的功能却需要一些技巧。下面我们将介绍如何使用动态或静态 SQL 实现类似于 Excel 的行列转置功能。 让我们创建一个用于存储学生成绩的表格: ```sql Create table Class( [Student] nvarchar(2), [Course] nvarchar(2), [Score] int) ``` 然后,我们可以使用以下动态 SQL 语句来实现行列转置: ```sql declare @s nvarchar(4000) set @s='' Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)' from Class group by [Course] exec('select [Student]'+@s+' from Class group by [Student]') ``` 上面的语句使用了动态 SQL 语句来生成基于课程的列名称,然后使用 CASE 语句将成绩相应的列进行填充。 相比之下,我们也可以使用静态 SQL 语句来实现行列转置: ```sql select [Student], [数学]=max(case when [Course]='数学' then [Score] else 0 end), [物理]=max(case when [Course]='物理' then [Score] else 0 end), [英语]=max(case when [Course]='英语' then [Score] else 0 end), [语文]=max(case when [Course]='语文' then [Score] else 0 end) from Class group by [Student] ``` 上面的语句使用了静态 SQL 语句来生成基于课程的列名称,然后使用 CASE 语句将成绩相应的列进行填充。 如果我们想要将总成绩(学科平均分)也包括在内,可以使用以下动态 SQL 语句: ```sql declare @s nvarchar(4000) set @s='' Select @s=isnull(@s+',','')+quotename([Course]) from Class group by [Course] exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b') ``` 或者使用静态 SQL 语句: ```sql select * from Class pivot (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b ``` 我们可以使用以下语句来获取总成绩: ```sql select [Student], [数学], [物理], [英语], [语文], ([数学]+[物理]+[英语]+[语文])/4 as [总成绩] from ( select [Student], [数学], [物理], [英语], [语文] from Class pivot (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b ) t ``` 通过上面的示例,我们可以看到使用动态或静态 SQL 语句都可以实现类似于 Excel 的行列转置功能,但是在实际应用中,我们需要根据具体情况选择合适的方法。
- 独鹿2020-01-07不错,可以用呢
- bakizhang2014-12-02不错,可以用到实例中。
- 粉丝: 1
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助