当前位置:  数据库>sqlserver

SQL2005使用PIVOT实现分组统计

    来源: 互联网  发布时间:2014-08-29

    本文导语:  PIVOT 是SQL Server 2005中新加入的运算符,PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。 通过具体的实例来讲解PIVOT的用法及功能。 注意:...

PIVOT 是SQL Server 2005中新加入的运算符,PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。

通过具体的实例来讲解PIVOT的用法及功能。

注意:对于从低版本(SQL Server 2000)升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 时,必须将数据库的兼容级别设置为 90 或更高。具体操作可执行下面语句实现:
EXEC sp_dbcmptlevel  数据库名称 ,90
例如:现在有这样一个学生成绩表 [StudentsScore],其中有学生姓名[Student]、学科[Subject]、成绩[Score]三个字段。(结构及数据如下图):

要求:按学生姓名[Student]显示各科成绩,并按姓名升序排列。

在传统应用中,可以通过SELECT...CASE语句达到目的,但是使用SQL Server 2005中新加入的PIVOT运算符将会使代码更简单、更具可读性。
实现代码:
 

代码示例:
declare @Str nvarchar(max)  
set     @str = 'select [Student]'   
select  @str = @str+',['+ Subject + ']' from [StudentsScore] group by [Subject]   
set     @str = @str+' FROM (SELECT [Student],[Score],[Subject] FROM [StudentsScore]) AS T PIVOT(SUM([Score]) FOR [Subject] IN (' 
select  @str = @str+' ['+ Subject + '],' from [StudentsScore] group by [Subject]   
set     @str = left(@str,Len(@str)-1)   
set     @str = @str+ ')) AS thePivot ORDER BY [Student] ASC' 
exec(@str)  

如果在此基础上还要求统计出总分,并按总分降序排列,只需稍稍做点改动就可以了,代码如下:
 

代码示例:
declare @Str nvarchar(max)  
set     @str = 'select [Student]'   
select  @str = @str+',['+ Subject + ']' from [StudentsScore] group by [Subject]   
set     @str = @str+',(' 
select  @str = @str+'['+ Subject + ']+' from [StudentsScore] group by [Subject]  
set     @str = left(@str,Len(@str)-1)   
set     @str = @str+') AS [总分] FROM (SELECT [Student],[Score],[Subject] FROM [StudentsScore]) AS T PIVOT(SUM([Score]) FOR [Subject] IN (' 
select  @str = @str+' ['+ Subject + '],' from [StudentsScore] group by [Subject]   
set     @str = left(@str,Len(@str)-1)   
set     @str = @str+ ')) AS thePivot ORDER BY [总分] DESC, [Student] ASC' 
exec(@str)

最终结果:
 

在程序中可以加上一个打印命令,将实际执行的SQL语句答应出来,如下:
 

代码示例:
select [Student],[数学],[英语],[中文],([数学]+[英语]+[中文]) AS 总分 FROM (SELECT [Student],[Score],[Subject] FROM [StudentsScore]) AS T PIVOT(sum([Score]) FOR [Subject] IN ( [数学], [英语], [中文])) AS thePivot ORDER BY [Student]  

这样一来,在列数已知的情况下,就可以直接构造类似的语句,而不需要定义变量。

下面是本文中用到的数据表及数据记录的SQL,方便大家测试。

数据表脚本:
 

代码示例:
/****** 对象:  Table [dbo].[StudentsScore]    脚本日期: 10/29/2009 22:56:18 ******/  
SET ANSI_NULLS ON 
GO  
SET QUOTED_IDENTIFIER ON 
GO  
SET ANSI_PADDING ON 
GO  
CREATE TABLE [dbo].[StudentsScore](  
    [Student] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,  
    [Subject] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,  
    [Score] [int] NULL 
) ON [PRIMARY]  
 
GO  
SET ANSI_PADDING OFF 

数据记录脚本:
 

代码示例:
Insert into StudentsScore (Student,Subject,Score) values ( '学生A', '中文', 80 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生A', '数学', 78 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生A', '英语', 92 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生B', '中文', 89 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生B', '数学', 87 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生B', '英语', 75 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生C', '中文', 92 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生C', '数学', 74 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生C', '英语', 65 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生D', '中文', 79 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生D', '数学', 83 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生D', '英语', 81 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生E', '中文', 73 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生E', '数学', 84 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生E', '英语', 93 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生F', '中文', 79 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生F', '数学', 86 );   
Insert into StudentsScore (Student,Subject,Score) values ( '学生F', '英语', 84 ); 
您可能感兴趣的文章:

    
 
 

您可能感兴趣的文章:

  • SQL分组排序去除重复实例
  • Sql Server多行合并一行 sql分组统计
  • sql分组查询(按组内个数排序)
  • SQL分组排序去重复的小实例
  • SQL分组统计简单例子
  • 显示同一分组中的其他元素的sql语句
  • sql中获取分组排序后数据方法实例
  • SQL语句分组获取记录的第一条数据的方法
  • SQL分组查询实例解析
  • sql语句获取分组排序后数据
  • sql server分组排序之row_number()over函数的使用
  • Sql Server 分组统计并合计总数(WITH ROLLUP用法)
  • sql分组排序与分组统计技巧
  • sql server 2000/2005/2008中一句话完成分组后加序号
  • sql获取分组排序后数据的脚本
  • sql server分组查询与排序的例子
  • sql server数据分组查询脚本分析
  • SQL分组排序与分组查询统计
  • Sql Server 分组统计并合计总数及WITH ROLLUP应用
  • 以数据库字段分组显示数据的sql语句(详细介绍)
  • SQL Server统计SQL语句执行时间的脚本
  • sql语句实例 统计一个特定页面中的相关链接
  • sql语句实例 统计页面链接的sql语句
  • 经典sql代码--统计文章各种分类总数
  • SQL 平均数统计
  • 用SQL统计SQLServe表存储空间大小的代码
  • 经典sql代码--统计电话通话次数以及时长
  • SQL语句技巧:按月统计数据
  • 统计某一字段等于不同值的个数的sql语句
  • SQL按照日、周、月、年统计数据的方法
  • sql2005统计技巧示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何实现连接一次数据库,提交多个sql语句。(sql的批处理)
  • 我想把csdn的论坛改成一个软件平台,另外增加数据查询功能,聊天功能,不知怎样实现比较好?我想用jbuider 7+SQL server实现,不知如何?
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • SQL Server设置主键自增长列(使用sql语句实现)
  • 如何实现DOS下用Turbo C 连接SQL Server 7?
  • 在SQL server 2000中用JAVA实现图片存储
  • 如何实现用jsp将sql server 的数据备份出来!并指定存放路径!
  • 如何实现图片上传啊,而且我想把它记录在SQL SERVER中!!有空请帮我!!!
  • 用oracle pl/sql 从A unix机器,去读取B unix机器上的一个文件,怎么实现?
  • 用SQL语句实现替换字符串
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • 写sql进数据库(DB2)怎样实现自动插入(表的主键为String)
  • SQL Server 7.0或2000 的jdbc驱动程序中提供了连接池的实现吗?
  • sql函数实现递归查询示例
  • 在ADF中跟踪SQL执行时间实现代码
  • sql server中通过查询分析器实现数据库的备份与恢复方法分享
  • SQL Server本地时间和UTC时间的相互转换实现代码
  • java实现简单的给sql语句赋值的示例
  • T-SQL 实现一个简单的 Split 函数
  • 在SQL中获取一个长字符串中某个字符串出现次数的实现方法
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3