要实现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