SQL Server 查询语句Pivot详解.pdf
文本预览下载声明
1.
PIVOT 语法。
SELECT 非透视的列,
[第一个透视的列] AS 列名称,
[第二个透视的列] AS 列名称,
...
[最后一个透视的列] AS 列名称,
FROM
(生成数据的 SELECT 查询)
AS 源查询的别名
PIVOT
(
聚合函数(要聚合的列)
FOR
[包含要成为列标题的值的列]
IN ( [第一个透视的列], [第二个透视的列],
... [最后一个透视的列])
) AS 透视表的别名
可选的 ORDER BY 子句;
2.
PIVOT 执行过程:
(1)in 后面的行值称为非透视列;
(2 )查询时先对非透视列的非聚合列进行分组;用一般查询语句表示如下:
Select 非透视列的非聚合列(包含要成为列标题的值的列), 聚合函数(要聚合的
列)
From 源表
Group by 非透视列的非聚合列
(3 )将要成为列标题的值转化成透视列,其值为 (2 )的查询结果集中对应的聚
合函数(要聚合的列)值;
(4 )由于执行步骤(3 )后,原分组列中少了(包含要成为列标题的值的列),因
此以剩下的列再分组,这可能会导致结果集的某条记录的透视列有多个值。
3 .例题:
1)源数据:
CREATE TABLE [dbo].[CJB](
[学号] [char](6) NOT NULL,
[课程号] [char](3) NOT NULL,
[成绩] [int] NULL
) ON [PRIMARY]
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101101, N101, 80)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101101, N102, 78)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101101, N206, 76)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101103, N101, 62)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101103, N102, 70)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101103, N206, 81)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101104, N101, 90)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101104, N102, 84)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101104, N206, 65)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101102, N102, 78)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101102, N206, 78)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101106, N101, 65)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101106, N102, 71)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101106, N206, 80)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101107, N101, 78)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101107, N102, 80)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101107, N206, 68)
INSERT [dbo].[CJB] ([学号], [课程号], [成绩]) VALUES (N101108, N101, 85)
INSERT [dbo].[CJB] ([学号], [课程号
显示全部