sqlserver 行转列

--行转列 case when then else 
select name,
max(case course when '语文' then score else 0 end) 语文,
max(case course when '数学' then score else 0 end) 数学
from [dbo].[test_pivot]
group by name
--PIVOT函数实现
SELECT *
FROM test_pivot
PIVOT (max(score) FOR course IN (语文,数学))
as t

--动态方式实现
declare @sql varchar(4000)
set @sql='select name'
select @sql=@sql+', max(case course when '''+course+''' then score else 0 end) '+course+''
from (select distinct course from test_pivot) as a
order by course
select @sql=@sql+' from  test_pivot  group by NAME'
print @sql
exec (@sql)

--PIVOT函数动态实现


declare  @name nvarchar(2000),
@name1 nvarchar(2000),
 @strSql nvarchar(2000)
 
SET @name=''
 --赋值 把所有要转化为列的数据保存在字符串中,并且以逗号分隔
 select  @name=@name+CDate  from (select  distinct '['+course+'],' AS CDate FROM test_pivot) AS T1
SET @name1=''
 
 select  @name1=@name1+CDate  from (select  distinct 'max('+course+') as '+course+',' AS CDate FROM test_pivot) AS T2
 SET @name1=SUBSTRING(@name1,1,LEN(@name1)-1)
 --去掉末尾的一个逗号
 SET @name=SUBSTRING(@name,1,LEN(@name)-1)
  PRINT(@name)
   PRINT(@name1)
   SET  @strSql ='select b.name as 姓名,'+@name1+'
    from test_pivot 
    pivot(
    max(score) 
    for course 
    in ('+@Name+')
    )  
    as b
    group by b.name'
--打印最终执行的SQL
 --PRINT(@strSql)
 exec(@strsql)

原始表数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值