行列转换

本文介绍两种SQL中的行列转换技巧:一种是将成绩表中的多条记录按学科转换为一行记录,另一种是通过自定义函数实现ID对应PID的合并。这两种方法能够帮助开发者更灵活地处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1. 行列转换--普通

假设有张学生成绩表(CJ)如下
[姓名]  [学科]  [成绩]
张三    语文    80
张三    数学    90
张三    物理    85
李四    语文    85
李四    数学    92
李四    物理    82
王五    数学    60

想变成    
[姓名] [语文] [数学] [物理]
张三   80     90     85
李四   85     92     82
王五   null   60     null

declare @sql varchar(4000)
set @sql = 'select 姓名'
select @sql = @sql + ',sum(case 学科 when ''' 学科 ''' then 成绩 end) as ' 学科
  from (select distinct 学科 from CJ) as a
set @sql = @sql ' from cj group by 姓名'
exec(@sql)


2. 行列转换--合并

有表A,
id pid
1   1
1   2
1   3
2   1
2   2
3   1
如何化成表B:
id pid
  1  1,2,3
  2  1,2
  3  1

创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str ',' cast(pid as varchar) from 表A where id=@id
set @str=right(@str,len(@str)-1)
return(@str)
end
go

--调用自定义函数得到结果
select distinct id,dbo.fmerg(id) from 表A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值