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 的行列转置功能,但是在实际应用中,我们需要根据具体情况选择合适的方法。