SQLServer行转列实现思路记录
2014-06-27来源:

SQLServer行转列的sql语句有很多,可以使用静态的、动态的、CaseWhen等等,均能实现。

最近面试遇到了一道面试题,顿时有点迷糊,只说出了思路,后来百度了一下,整理了一下思路,于是记录下来,方便以后学习。

相关的数据表:

1.Score表

1

2.[User]表

2

SQL语句如下:

--方法一:静态SQL

代码如下:

SELECT*FROM

(SELECTUID,Name,Score,ScoreNameFROMScore,[User]WHEREScore.UID=[User].ID)ASSourceTable

PIVOT(AVG(Score)FORScoreNameIN([英语],[数学]))ASa

--方法二:动态SQL

代码如下:

DECLARE@sNVARCHAR(4000)

SELECT@s=ISNULL(@s+',','')+QUOTENAME(ScoreName)

FROM(selectdistinctScoreNamefromScore)asA---列名不要重复

Declare@sqlNVARCHAR(4000)

SET@sql='

selectr.*from

(selectUID,Name,ScoreName,ScorefromScore,[User]whereScore.UID=[User].ID)ast

pivot

(

max(t.Score)

fort.ScoreNamein('+@s+')

)asr'

EXEC(@sql)

--方法三:CaseWhen

代码如下:

select

row_number()OVER(ORDERBY[User].ID)as编号,

UIDas用户编号,

Nameas姓名,

max(caseScoreNamewhen'英语'thenScoreelse0end)英语,

max(caseScoreNamewhen'数学'thenScoreelse0end)数学

fromScore,[User]WHEREScore.UID=[User].ID

groupbyUID,[User].ID,Name

更多信息请查看IT技术专栏

推荐信息
Baidu
map