SQLServer行转列的sql语句有很多,可以使用静态的、动态的、CaseWhen等等,均能实现。
最近面试遇到了一道面试题,顿时有点迷糊,只说出了思路,后来百度了一下,整理了一下思路,于是记录下来,方便以后学习。
相关的数据表:
1.Score表
2.[User]表
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技术专栏