当前位置: 首页 > 数据库 > MSSQL > 正文

SQL中行转列和列转行

时间:2015-02-18

行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过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', '语文', 80
   
    
   
INSERT INTO [StudentScores] SELECT 'Nick', '数学', 90
   
    
   
INSERT INTO [StudentScores] SELECT 'Nick', '英语', 70
   
    
   
INSERT INTO [StudentScores] SELECT 'Nick', '生物', 85
   
    
   
INSERT INTO [StudentScores] SELECT 'Kent', '语文', 80
   
    
   
INSERT INTO [StudentScores] SELECT 'Kent', '数学', 90
   
    
   
INSERT INTO [StudentScores] SELECT 'Kent', '英语', 70
   
    
   
INSERT INTO [StudentScores] SELECT 'Kent', '生物', 85

如果我想知道每位学生的每科成绩,而且每个学生的全部成绩排成一行,这样方便我查看、统计,导出数据

SELECT
   
      UserName, 
   
      MAX(CASE Subject WHEN '语文' THEN Score ELSE 0 END) AS '语文',
   
      MAX(CASE Subject WHEN '数学' THEN Score ELSE 0 END) AS '数学',
   
      MAX(CASE Subject WHEN '英语' THEN Score ELSE 0 END) AS '英语',
   
      MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物'
   
FROM dbo.[StudentScores]
   
GROUP BY UserName
查询结果如图所示,这样我们就能很清楚的了解每位学生所有的成绩了