数据记录行转列

数据库有Score表的数据如下:

tname   subject score
stu1Chinese80
stu1English60
stu1Math75
stu2Chinese80
stu2English85
stu3Chinese85
stu3Math90

 

需要行列转换,获取下列视图:

tname

Chinese

English

Math

stu1

80

60

75

stu2

80

85

 

stu3

85

 

90

 

如何通过SQL代码实现呢? 下面针对SQL 2000/2005 分别给出了方法:

 

--SQL2000 静态 sql

SELECT tname,

                Chinese = MAX(CASE subject WHEN 'Chinese' THEN score ELSE 0 END),

                English = MAX(CASE subject WHEN 'English' THEN score ELSE 0 END),

                Math = MAX(CASE subject WHEN 'Math' THEN score ELSE 0 END)

FROM teammember

GROUP BY tname

ORDER BY tname

 

--SQL2000 动态 sql

DECLARE @sql NVARCHAR(4000)

SET @sql = 'SELECT tname'

SELECT  @sql = @sql + ', ' + a.subject + ' = MAX(CASE subject WHEN ''' + a.subject + ''' THEN score ELSE 0 END)'

                FROM (SELECT DISTINCT subject FROM teammember) a ORDER BY subject

SET @sql = @sql + ' FROM teammember GROUP BY tname ORDER BY tname'

EXEC(@sql)

 

--SQL2005 静态 sql

SELECT * FROM (SELECT * FROM teammember) a PIVOT (MAX(score) FOR subject IN (Chinese, English, Math)) b

 

--SQL2005 动态 sql

DECLARE @sql NVARCHAR(4000)

SELECT @sql = ISNULL(@sql + ',' , '') + subject FROM teammember GROUP BY subject

EXEC ('SELECT * FROM (SELECT * FROM teammember) a PIVOT (MAX(score) FOR subject IN (' + @sql + ')) b')

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值