SQL 行列转换

方法1
在这里插入图片描述

select name,
sum(case when course='物理' then score else 0 end) as 物理,
sum(case when course='英语' then score else 0 end) as 英语
from T1

方法2
在这里插入图片描述
在这里插入图片描述
动态SQL命令的执行效率往往不高,因为动态拼接的原因,导致数据库(查询优化器)可能无法对这样的命令进行优化。此外,这样的SQL命令还受限于字符串的长度(需要事先确定其长度限制),而动态SQL命令的长度往往是根据实际表的内容而改变,因此这类动态SQL命令无法保证100%正常运行。

alter PROCEDURE P1
AS
BEGIN
–申明一个字符串用于动态拼接
declare @sql varchar(8000) =null
–拼接SQL语句
set @sql = ‘select name as “姓名”’
–动态地获得材料名,为每个材料构建一个列
select @sql = @sql + ‘,SUM(case course when ‘’’+temp.Item+‘’’ then score else 0 end) as [‘+temp.Item+’–]’
from (select distinct course as Item from T1) as temp
–最终拼上数据源和分组依据
select @sql = @sql + ’ from T1 group by name’
–执行SQL语句
print(@sql)
exec(@sql)
END
GO
方法3

select * from T1
PIVOT(sum(score)FOR course in(物理,英语)) tt
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
UNPIVOT 列变行
select , --非透视列
[unpivot_column], --透视列
[value_column],
from table_name
unpivot ( [value_column] for [unpivot_column] in ( <column_list> ) )
as --别名
–[value_column] 确定一个列名称来代表不转换的列的数据。
–[unpivot_column] 转换列的名称
–<column_list>: 被转换的列的列名称。

select u.name, u.subject, u.score
from stu_score
unpivot
(
score
for subject in (Math, Chinese)
) u;
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值