SQL Server中使用PIVOT行转列
使用PIVOT行转列
1.建表及插入数据
USE [AdventureDB]
GO
/****** Object: Table [dbo].[Score] Script Date: 11/25/2016 4:30:50 PM ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[Score]([Name] [varchar](50) NULL,[Subject] [varchar](50) NULL,[Score] FLOAT NULL) ON [PRIMARY]
GO INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Jack', N'linguistic', 65)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Tom', N'linguistic', 56)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Lina', N'linguistic', 84)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Jack', N'Mathematics', 100)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Tom', N'Mathematics', 82)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Lina', N'Mathematics', 67)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Jack', N'English', 82)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Tom', N'English', 54)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Lina', N'English', 76)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'James', N'Other', 52)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Tom', N'Other', 99)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Lina', N'Other', 79)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Kobe', N'linguistic', 65)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'James', N'linguistic', 76)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Kidd', N'linguistic', 86)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'James', N'Mathematics', 70)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Kobe', N'Mathematics', 92)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Kidd', N'Mathematics', 70)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Kobe', N'English', 86)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Kidd', N'English', 85)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'James', N'English', 66)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Jack', N'Other', 77)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Kobe', N'Other', 97)
INSERT INTO [dbo].[Score] ([Name], [Subject], [Score]) VALUES (N'Kidd', N'Other', 93)

2.使用CASE语句查询
USE [AdventureDB]
GO /****** Object: StoredProcedure [dbo].[CaseSelect] Script Date: 12/02/2016 00:47:02 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE procedure [dbo].[CaseSelect] AS BEGIN SELECT [Name],
SUM (case when [Subject] = 'English' then [Score] else 0 end) English,
SUM (case when [Subject] = 'linguistic' then [Score] else 0 end) Linguistic,
SUM (case when [Subject] = 'Mathematics' then [Score] else 0 end) Mathematics,
SUM (case when [Subject] = 'Other' then [Score] else 0 end) Other,
AVG ([Score]) Average
FROM [dbo].[score] GROUP BY [Name] ORDER BY [Name] DESC END GO

3.使用PIVOT行转列
USE [AdventureDB]
GO /****** Object: StoredProcedure [dbo].[Pivot] Script Date: 12/02/2016 01:07:27 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE procedure [dbo].[Pivot]
@NumberOfStudents int = 5
AS IF @NumberOfStudents < 1 or @NumberOfStudents > 10
RAISERROR('@NumberOfStudents must be between 1 and 10', 11, 1);
ELSE
SELECT top(@NumberOfStudents)
p.[name],
p.English,
p.linguistic,
p.Mathematics,
p.Other,
(p.English + p.linguistic+p.Mathematics + p.Other)/4 AS Average
FROM [dbo].[score] PIVOT (SUM (score) FOR [subject] IN (English,linguistic,Mathematics,Other) ) AS P
ORDER BY p.[name] DESC RETURN; GO
4.PIVOT动态获取列
USE [AdventureDB]
GO /****** Object: StoredProcedure [dbo].[Pivot_DynamicColumn] Script Date: 12/02/2016 01:31:30 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE procedure [dbo].[Pivot_DynamicColumn] AS BEGIN
DECLARE @ColumnNames NVARCHAR(Max)
DECLARE @AverageScore NVARCHAR(Max)
DECLARE @ColumnCount int SET @ColumnNames=''
SET @AverageScore = ''
SET @ColumnCount = '' SELECT @ColumnCount = COUNT(DISTINCT [Subject]) FROM [Score] SELECT
@ColumnNames = @ColumnNames + '[' + [Subject] + '],',
@AverageScore = @AverageScore + '[' + [Subject] + ']+'
FROM
(
SELECT DISTINCT [Subject] FROM [Score]
) t SET @ColumnNames= LEFT(@ColumnNames, LEN(@ColumnNames)-1)
SET @AverageScore= LEFT(@AverageScore, LEN(@AverageScore)-1) DECLARE @selectSQL NVARCHAR(Max) SET @selectSQL=
'SELECT [name],{0},({1})/{2} as Average FROM
[dbo].[score]
Pivot(SUM(score) For [subject] in ({0})) AS p
ORDER BY p.[name] DESC' SET @selectSQL= REPLACE(@selectSQL,'{0}',@ColumnNames)
SET @selectSQL= REPLACE(@selectSQL,'{1}',@AverageScore)
SET @selectSQL= REPLACE(@selectSQL,'{2}',@ColumnCount) EXEC sp_executesql @selectSQL
END GO
使用UNPIVOT列转行
1.建表及插入数据
USE [AdventureDB]
GO /****** Object: Table [dbo].[ScorePivot] Script Date: 2016/12/6 17:38:48 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[ScorePivot](
[Name] [varchar](50) NULL,
[English] [varchar](50) NULL,
[Linguistic] [varchar](50) NULL,
[Mathematics] [varchar](50) NULL,
[Other] [varchar](50) NULL) ON [PRIMARY]
GO INSERT INTO [dbo].[ScorePivot] ([Name], [English], [Linguistic], [Mathematics], [Other]) VALUES (N'Tom', N'', N'', N'', N'')
INSERT INTO [dbo].[ScorePivot] ([Name], [English], [Linguistic], [Mathematics], [Other]) VALUES (N'Lina', N'', N'', N'', N'')
INSERT INTO [dbo].[ScorePivot] ([Name], [English], [Linguistic], [Mathematics], [Other]) VALUES (N'Kobe', N'', N'', N'', N'')
INSERT INTO [dbo].[ScorePivot] ([Name], [English], [Linguistic], [Mathematics], [Other]) VALUES (N'Kidd', N'', N'', N'', N'')
INSERT INTO [dbo].[ScorePivot] ([Name], [English], [Linguistic], [Mathematics], [Other]) VALUES (N'James', N'', N'', N'', N'')
INSERT INTO [dbo].[ScorePivot] ([Name], [English], [Linguistic], [Mathematics], [Other]) VALUES (N'Jack', N'', N'', N'', N'')

2.使用UNPIVOT列转行
USE [AdventureDB]
GO /****** Object: StoredProcedure [dbo].[UNPivot] Script Date: 2016/12/6 17:49:54 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE procedure [dbo].[UNPivot] AS SELECT
[Name], [Subject], [Score]
FROM
(
SELECT [Name], [English],[Linguistic],[Mathematics], [Other] FROM [dbo].[ScorePivot]
) data
UNPIVOT
(
[Score] FOR [Subject] IN
(
[English], [Linguistic], [Mathematics], [Other]
)
)AS nupvt GO

SQL Server中使用PIVOT行转列的更多相关文章
- SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行
ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列 ...
- SQL Server 2008 R2——PIVOT 行转列 以及聚合函数的选择
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 处理SQL Server中的重复行
如果表中的数据需要基于行中的多个值具有唯一约束,则适合的解决方案将是复合健. 复合主键 使用SQL Server语法创建符合主键非常简单. create table my_parts ( id_par ...
- SQL SERVER 字符合并多行为一列
[字符合并多行为一列] 思路1:行转列,在与字符拼接(适用每组列数名相同) 思路2:转xml,去掉多余字符(适用所有) 假设兴趣表Hobbys Name Hobby 小张 打篮球 小张 踢足球 Nam ...
- sql server存储过程分页,行变列
CREATE PROCEDURE [dbo].[PROC_GetPriviousAndNextDetailContent]@Index varchar(20),--表主键@Table varchar( ...
- C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
/// <summary>/// 单表(视图)获取分页SQL语句/// </summary>/// <param name="tableName"&g ...
- sql server 实现split功能 行转列
--實現split功能的函數create function [dbo].[func_split]( @SourceSql varchar(max), @StrSeprate varchar(10))r ...
- 在SQL Server中批量修改有规律列的定义
)=N'要修改的表名'; --修改所有以sl结尾的列名的小数位数为4位 select syscolumns.name into #t1 from syscolumns,systypes where s ...
- 在Sql Server中使用Guid类型的列及设置Guid类型的默认值
1.列的类型为uniqueidentifier 2.列的默认值可以设为newid()
随机推荐
- 【jQuery小实例】---3 凤凰网首页图片动态效果
---本系列文章所用使用js均可在本博客文件中找到 本页面实现类似于凤凰网首页,鼠标点击新闻,可以在div中显示新闻图片,点击军事显示军事图片的效果.采用的思路是:鼠标悬浮,显示当前div中的内容(图 ...
- MVC前台Post/Get异步获得数据时参数的取值问题
Post方法,返回text,后台获得Data View $.ajax({ type: "POST", dataType: "text",//返回类型为文本 ur ...
- 关于JavaScript变量提升的理解
废话不说,直接上代码(这是在JavaScript面对对象编程指南上面看到的一个例子) var a=123; function f(){ alert(a); var a=1; alert(a); } f ...
- 设置WPF输入框焦点
在WPF中设置控件键盘焦点 Keyboard.Focus(/*控件名称*/);
- jQuery AutoComplete在AJAX UpdatePanel环境中PostBack之后无法工作
前些日子,Insus.NET有实现<ASP.NET MVC使用jQuery实现Autocomplete>http://www.cnblogs.com/insus/p/5638895.htm ...
- 简谈asp.net下的异步加载
具体我本身大概用的就有两种,需配合JQ. 第一种,直接通过AJAX去请求页面:例如, 1:dataType必须是html或者Text格式, 2:Type:必须是'Post'请求 3:后台Load事件必 ...
- Socket编程——客户端,服务器端的读写操作
URL网络编程,最大的特征就是一对一的响应! 1:客户端“写”,服务器端用于“读” package coreBookSocket2; import java.io.InputStreamReader; ...
- Java--缓存热点数据,最近最少使用算法
1.最近最少使用算法LRU (Least recently used,最近最少使用) [实现]:最常见的是使用一个链表保存缓存数据 1.新数据插入到链表头部: 2.每当缓存命中(即缓存数据被访问),将 ...
- SpringMVC的注解开发入门
1.Spring MVC框架简介 支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器(HttpMessageConverter) 和数据转换.格式化.验证框架无缝集成 ...
- svg.js教程及使用手册详解(一)
做毕设的时候,因为要使用到画图和自定义动画,所以接触到了SVG.网上关于SVG和Canvas的对比很多,具体的辨析这里就不赘言.网上关于SVG的所谓教程基本上都是SVG本身,但是却没有一个针对svg. ...