使用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行转列的更多相关文章

  1. SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行

    ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列 ...

  2. SQL Server 2008 R2——PIVOT 行转列 以及聚合函数的选择

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  3. 处理SQL Server中的重复行

    如果表中的数据需要基于行中的多个值具有唯一约束,则适合的解决方案将是复合健. 复合主键 使用SQL Server语法创建符合主键非常简单. create table my_parts ( id_par ...

  4. SQL SERVER 字符合并多行为一列

    [字符合并多行为一列] 思路1:行转列,在与字符拼接(适用每组列数名相同) 思路2:转xml,去掉多余字符(适用所有) 假设兴趣表Hobbys Name Hobby 小张 打篮球 小张 踢足球 Nam ...

  5. sql server存储过程分页,行变列

    CREATE PROCEDURE [dbo].[PROC_GetPriviousAndNextDetailContent]@Index varchar(20),--表主键@Table varchar( ...

  6. C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序

    /// <summary>/// 单表(视图)获取分页SQL语句/// </summary>/// <param name="tableName"&g ...

  7. sql server 实现split功能 行转列

    --實現split功能的函數create function [dbo].[func_split]( @SourceSql varchar(max), @StrSeprate varchar(10))r ...

  8. 在SQL Server中批量修改有规律列的定义

    )=N'要修改的表名'; --修改所有以sl结尾的列名的小数位数为4位 select syscolumns.name into #t1 from syscolumns,systypes where s ...

  9. 在Sql Server中使用Guid类型的列及设置Guid类型的默认值

    1.列的类型为uniqueidentifier 2.列的默认值可以设为newid()

随机推荐

  1. Redis数据类型,以及应用场合

    Redis常用的数据类型为String,Hash,List,Set等,简介如下: String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供 ...

  2. Javascript 接口模拟

    Javascript接口模拟可以通过三种方式实现文档手段(注释).辅助类和鸭式辨. 第一种和第二种只形式上体现没有真正的实现. 鸭式辨实现原理是:"只要能像鸭子一样叫和走就是鸭子" ...

  3. 【原创】Kafka topic常见命令解析

    本文着重介绍几个常用的topic命令行命令,包括listTopic,createTopic,deleteTopic和describeTopic等.由于alterTopic并不是很常用,本文中就不涉及了 ...

  4. Nancy之Pipelines三兄弟(Before After OnError)

    一.简单描述 Before:如果返回null,拦截器将主动权转给路由:如果返回Response对象,则路由不起作用. After : 没有返回值,可以在这里修改或替换当前的Response. OnEr ...

  5. MS SQLServer的关键词BETWEEN的一些注意事项

    近段时间在程序中写到有关搜索的功能.其中有使用到MS SQLServer的关键词BETWEEN,它是搜索数值范围(包括本身)之间的数据. 在使用它时,一些情况还需要注意的.如果时间的数据. 搜索时间数 ...

  6. nginx 添加nginx-http-concat模块

    github地址:https://github.com/alibaba/nginx-http-concat/tree/master 简单的描述一下吧,网上说的安装新的模块需要重新编译nginx,具体的 ...

  7. 数据结构:单链表结构字符串(python版)改进

    此篇文章的replace实现了字符串类的多次匹配,但依然有些不足. 因为python字符串对象为不变对象,所以replace方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...

  8. MyEclipse10查看Struts2源码及Javadoc文档

    1:查看Struts2源码 (1):Referenced Libraries >struts2-core-2.1.6.jar>右击>properties. (2):Java Sour ...

  9. No.025:Reverse Nodes in k-Group

    问题: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  10. ADO.NET 中的新增功能

    ADO.NET 中的新增功能: .NET Framework (current version) 以下是 .NET Framework 4.5 中 ADO.NET 的新增功能. SqlClient D ...