SQL Server 实现 行转列、列转行

来源:互联网 发布:电路仿真软件中文版 编辑:程序博客网 时间:2024/04/30 00:53

        行列互转是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。 用传统的方法,比较好理解。层次清晰,而且比较习惯。 但是PIVOT 、UNPIVOT提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单、更具可读性。

 
行转列的实现:
 CREATE  TABLE #StudentScores(    [UserName]         NVARCHAR(20),        --学生姓名    [Subject]          NVARCHAR(30),        --科目    [Score]            FLOAT,               --成绩)INSERT INTO #StudentScores SELECT 'Nick', '语文', 80INSERT INTO #StudentScores SELECT 'Nick', '数学', 90INSERT INTO #StudentScores SELECT 'Nick', '英语', 70INSERT INTO #StudentScores SELECT 'Nick', '生物', 85INSERT INTO #StudentScores SELECT 'Kent', '语文', 45INSERT INTO #StudentScores SELECT 'Kent', '数学', 67INSERT INTO #StudentScores SELECT 'Kent', '英语', 97INSERT INTO #StudentScores SELECT 'Kent', '生物', 34
select [UserName],[语文],[数学],[英语],[生物]from(select [UserName],[Subject],[Score] from #StudentScores) apivot(max(Score) for [Subject] in ([语文],[数学],[英语],[生物])) as t

列转行的实现:
CREATE TABLE #Temp(    [UserName] NVARCHAR(20),     [语文] float,     [数学] float,     [英语] float,     [生物] float )insert into #Temp select 'Nick',80,90,70,85insert into #Temp select 'Kent',45,67,97,34
SELECT UserName,[Subject],ScoreFROM (    SELECT UserName, [语文], [数学],[英语], [生物]     FROM #Temp)TUNPIVOT (    Score FOR [Subject] IN    ([语文], [数学],[英语], [生物])) P
原创粉丝点击