行转列PIVOT用法

新建StudentScore表:

CREATE TABLE [dbo].[StudentScore](
    [ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [StudentCard] [varchar](50) NOT NULL,
    [StudentName] [nvarchar](5) NOT NULL,
    [Type]  [nvarchar](10) NOT NULL,
    [Course] [nvarchar](10) NOT NULL,
    [Score] [float] NOT NULL,
) 

插入测试数据:

INSERT INTO StudentScore VALUES(‘001‘,‘小明‘,‘考试1‘,‘语文‘,80)
INSERT INTO StudentScore VALUES(‘002‘,‘小红‘,‘考试1‘,‘语文‘,60)
INSERT INTO StudentScore VALUES(‘003‘,‘小王‘,‘考试1‘,‘语文‘,55)
INSERT INTO StudentScore VALUES(‘004‘,‘小龙‘,‘考试1‘,‘语文‘,90)
INSERT INTO StudentScore VALUES(‘005‘,‘小军‘,‘考试1‘,‘语文‘,72)

INSERT INTO StudentScore VALUES(‘001‘,‘小明‘,‘考试1‘,‘数学‘,90)
INSERT INTO StudentScore VALUES(‘002‘,‘小红‘,‘考试1‘,‘数学‘,65)
INSERT INTO StudentScore VALUES(‘003‘,‘小王‘,‘考试1‘,‘数学‘,52)
INSERT INTO StudentScore VALUES(‘004‘,‘小龙‘,‘考试1‘,‘数学‘,91)
INSERT INTO StudentScore VALUES(‘005‘,‘小军‘,‘考试1‘,‘数学‘,82)

INSERT INTO StudentScore VALUES(‘001‘,‘小明‘,‘考试1‘,‘英语‘,70)
INSERT INTO StudentScore VALUES(‘002‘,‘小红‘,‘考试1‘,‘英语‘,80)
INSERT INTO StudentScore VALUES(‘003‘,‘小王‘,‘考试1‘,‘英语‘,75)
INSERT INTO StudentScore VALUES(‘004‘,‘小龙‘,‘考试1‘,‘英语‘,60)
INSERT INTO StudentScore VALUES(‘005‘,‘小军‘,‘考试1‘,‘英语‘,62)

INSERT INTO StudentScore VALUES(‘001‘,‘小明‘,‘考试2‘,‘语文‘,82)
INSERT INTO StudentScore VALUES(‘002‘,‘小红‘,‘考试2‘,‘语文‘,68)
INSERT INTO StudentScore VALUES(‘003‘,‘小王‘,‘考试2‘,‘语文‘,58)
INSERT INTO StudentScore VALUES(‘004‘,‘小龙‘,‘考试2‘,‘语文‘,93)
INSERT INTO StudentScore VALUES(‘005‘,‘小军‘,‘考试2‘,‘语文‘,75)

INSERT INTO StudentScore VALUES(‘001‘,‘小明‘,‘考试2‘,‘数学‘,92)
INSERT INTO StudentScore VALUES(‘002‘,‘小红‘,‘考试2‘,‘数学‘,69)
INSERT INTO StudentScore VALUES(‘003‘,‘小王‘,‘考试2‘,‘数学‘,58)
INSERT INTO StudentScore VALUES(‘004‘,‘小龙‘,‘考试2‘,‘数学‘,93)
INSERT INTO StudentScore VALUES(‘005‘,‘小军‘,‘考试2‘,‘数学‘,88)

INSERT INTO StudentScore VALUES(‘001‘,‘小明‘,‘考试2‘,‘英语‘,77)
INSERT INTO StudentScore VALUES(‘002‘,‘小红‘,‘考试2‘,‘英语‘,88)
INSERT INTO StudentScore VALUES(‘003‘,‘小王‘,‘考试2‘,‘英语‘,78)
INSERT INTO StudentScore VALUES(‘004‘,‘小龙‘,‘考试2‘,‘英语‘,66)
INSERT INTO StudentScore VALUES(‘005‘,‘小军‘,‘考试2‘,‘英语‘,63)

查看各科目最大的成绩:

SELECT [语文],[数学],[英语] FROM
(
    select Course,Score from StudentScore
) AS s
PIVOT
(
    MAX(Score) FOR Course IN ([语文],[数学],[英语])
) AS t

结果如下:

查看每次考试各科最高成绩:

SELECT [Type],[语文],[数学],[英语] FROM
(
    select [Type],Course,Score from StudentScore
) AS s
PIVOT
(
    MAX(Score) FOR Course IN ([语文],[数学],[英语])
) AS t

结果如下:

需要注意的是,当表里不是只有查询所用到的列Type、Score、Course时, 这里需要加子查询并指定查询的列名,否则会出现这种情况

SELECT [Type],[语文],[数学],[英语] FROM StudentScore
PIVOT
(
    MAX(Score) FOR Course IN ([语文],[数学],[英语])
) AS pvt

行转列PIVOT用法

时间: 2024-10-02 21:13:12

行转列PIVOT用法的相关文章

sql 行转列 PIVOT 列转行 UNPIVOT

原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 22 2013 公司3 32 2012 公司1 42 2012 公司2 52 2012 公司3 62 表二: 年 公司1 公司2 公司3 2012 42 52 62 2013 12 22 32 可使用sql2005之后提供的PIVOT 具体操作如下: select * from   t_table1

动态行转列 pivot实现

declare @sql varchar(8000)    begin              set @sql=''  --初始化变量@sql              select  @[email protected]+',['+ convert(varchar(10),CreateDate,120)+']' from  vwStationYield               where CreateDate > DATEADD(dd,-14,convert(varchar(10),g

sql的行转列(PIVOT)与列转行(UNPIVOT)

在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩 ) INSERT INTO [StudentScores] SE

Oracle 行转列(pivot、wm_concat、decode)使用总结(转载)

偶然需要了解,学习了这篇文章,转载记录一下 自:http://blog.csdn.net/jxzkin/article/details/7949629 1.创建测试数据 [html]?view plaincopy CREATE?TABLE?CC?? ??(Student?NVARCHAR2(2),Course?NVARCHAR2(2),Score?INT?? ??);?? [html]?view plaincopy INSERT?into?CC??? select?N'张三',N'语文',78?

SQL行转列(PIVOT)与列转行(UNPIVOT)简明方法

原文地址:https://www.cnblogs.com/linJie1930906722/p/6036714.html 在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(3

Sql 动态行转列 pivot

最近朋友有个需求:将产品中为“期刊”的书品以行转列的形式展现,同时需要关联工单主表及工单明细表,显示内容为,工单号.操作日期.产品名称及数量,由于期刊的产品数量较多,静态的虽然可以实现,但不利于后续内容的添加,就想着如何能以动态的形式展现,自动拼接sql语句处理,具体实现过程如下. 产品信息表需用到的字段内容: select ProductCode,Name from ComProduct where ProductType ='20' 工单需要用到的内容: select JobNo,Produ

Oracle 行转列(pivot、wm_concat、decode)使用总结

CREATE TABLE CC (Student NVARCHAR2(2),Course NVARCHAR2(2),Score INT ); INSERT into CC select N'张三',N'语文',78 from dual union all select N'张三',N'数学',87 from dual union all select N'张三',N'英语',82 from dual union all select N'张三',N'物理',90 from dual union

with as用法及行转列的用法

用with as 建立临时表(产品使用记录),想要达到什么目的?统计产品每日使用情况 with  productD as(     select to_date('2015-1-1','yyyy-MM-dd') as dt,'A01' as productNo,'10' as pNum from dual     union all      select to_date('2015-1-1','yyyy-MM-dd') as dt,'A02' as productNo,'10' as pNum

SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

来自于 https://www.cnblogs.com/OpenCoder/p/6668882.html 我们在写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求,拼接sql字符串,然后使用sp_executesql执行sql字符串是比较常规的一种做法.但是这样做实现起来非常复杂,而在SqlServer2005中我们有了PIVOT/UNPIVOT函数可以快速实现行转列和列转行的操作. PIVOT函数,行转列 PIVOT函数的格式如下 PIVOT(<聚合函数>([聚合列值]) FOR