关键词

Sql Server中实现行数据转为列显示

要实现Sql Server中行数据转为列显示,需使用Pivot语句。下面是详细步骤:

1.创建数据表,并插入实例数据

首先创建一个数据表,我们以学生表为例,表格结构如下:

CREATE TABLE student (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    sex VARCHAR(10) NOT NULL,
    score INT NOT NULL
);

INSERT INTO student VALUES
  (1, 'Jack', 'Male', 90),
  (2, 'Mary', 'Female', 85),
  (3, 'Lucy', 'Female', 95);

2.使用Pivot语句执行行数据转列显示

Pivot语句可以将行数据列出为列。下面是使用Pivot语句将学生的成绩按照不同性别显示的SQL语句:

SELECT * FROM
(
   SELECT sex, name, score 
   FROM student
) AS SourceTable
PIVOT
(
   AVG(score)
   FOR name IN ([Jack],[Mary],[Lucy])
) AS PivotTable;

上面的SQL语句中,AVG(score)是计算多个学生成绩的平均值, FOR name IN ([Jack],[Mary],[Lucy])则是指生成学生姓名为列名,分别为Jack、Mary、Lucy的三列数据。

执行上述SQL语句后,可以看到如下结果:

sex Jack Mary Lucy
Female NULL 85 95
Male 90 NULL NULL

由此可见,我们成功的将学生表的行数据转为列。

3.使用Pivot语句执行多字段行转列

除了单个字段行转列,还可以通过在Pivot语句中使用多个字段实现多字段行转列。下面的SQL语句实现了将学生表的不同性别下的最高和最低成绩转为列显示:

SELECT * FROM
(
   SELECT sex, 
          'Max' + CAST(ROW_NUMBER() OVER (PARTITION BY sex ORDER BY score DESC) AS VARCHAR) as Max,
          'Min' + CAST(ROW_NUMBER() OVER (PARTITION BY sex ORDER BY score ASC) AS VARCHAR) as Min, 
          score
   FROM student
) AS SourceTable
PIVOT
(
   AVG(score)
   FOR [Max1] IN ([Max1]), [Min1] IN ([Min1])
) AS PivotTable;

上面的SQL语句中,'Max'+CAST(ROW_NUMBER() OVER (PARTITION BY sex ORDER BY score DESC) AS VARCHAR)'Min'+CAST(ROW_NUMBER() OVER (PARTITION BY sex ORDER BY score ASC) AS VARCHAR) 表示检索性别分组计算成绩最高或最低的成绩,并用"Max"或"Min"作为字段前缀,再加上排行的数字进行重命名。

执行上面的SQL语句后,可以看到如下结果:

sex Max1 Min1
Female 95 85
Male 90 NULL

由此可见,使用Pivot语句还可以实现多字段行转列。

本文链接:http://task.lmcjl.com/news/18832.html

展开阅读全文