本文为原创,如需转载,请注明作者和出处,谢谢!
在输出统计结果时可能需要将列变成行,而将聚合结果(如count、sum)作为记录的第一行,先看如下的SQL语句:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->declare@ttable(namevarchar(20))
insert@t
select'abc'unionall
select'xxx'unionall
select'xxx'unionall
select'ttt'
select*from@t
在执行上面的SQL语句后,会输出如图1所示的记录集。
图1
上图显示的是一个普通的记录集,如果要统计name字段的每个值的重复数,需要进行分组,如下面的SQL如示:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->selectcount(name)asc,namefrom@tgroupbyname
执行上面的SQL语句后的查询结果如图2所示。
图2
如果我们有一个需求,需要如图3所示的聚合结果。
图3
从图3可以看出,查询结果正好是图2的结果逆时针旋转90度,也就是说,name列的值变成了列名,而c列的值变成了第一行的记录。图2所示的c和name字段消失了。
当然,要达到这个结果并不困难,看如下的SQL语句:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->select(selectcount(name)from@twherename='abc')asabc,
(selectcount(name)from@twherename='ttt')asxxx,
(selectcount(name)from@twherename='xxx')asttt
上
面的SQL语句会出输出如图3的查询结果。但这里有个问题,上面的SQL语句是枚举了name列所有可能的值,在本例中只有三个值('abc',
'ttt','xxx'),这非常好枚举,但如果有很多值,SQL语句会变得非常长,非常不利于编写。当然,可以通过编程的方式自动生成,但最终结果仍然
会生成很长的SQL语句。
为了解决这个问题,在SQL Server2005中提供了一个pivot函数,该函数可以很容易地输出如图3所示的记录集,如下面的SQL语句所示:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->select*from@tpivot(count(name)fornamein([abc],[ttt],[xxx]))
在执行上面的SQL语句同样可以获得图3所示的查询结果。实际上,pivot函数也起到了分组的作用。在使用pivot函数时应注意如下几点:
1.pivot函数需要指定聚合函数,如count、sum等,for关键字和聚合函数都要使用需要聚合的字段名,在本例中是name。
2.in关键字负责指定每组需要聚合的值,用[...]将这些值括起来。实际上,这些值也相当于我们第一种聚合方法中的where条件,例如,where name='abc'、where name='ttt',当然,这些值也是输出记录集的列名。
3.在最后要为pivot函数起一个别名。
虽然当要聚合的值很多时(或不确定),也需要动态生成SQL语句,但使用pivot函数的SQL语句却短很多。
如
果我们还有一个需求,要将图3的结果变成图2的结果,也就是顺时针旋转90度,仍然以c和name作为字段名。也许方法很多,但SQL
Server2005提供了一个unpivot函数,该函数是pivot函数的逆过程。也就是将记录集顺时针旋转90度,先看下面的SQL语句:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->declare@ttable(namevarchar(20))
insert@t
select'abc'unionall
select'xxx'unionall
select'xxx'unionall
select'ttt'
;
withttas(
select*from@tpivot(count(name)fornamein([abc],[ttt],[xxx]))p)
select*fromtt
上面的SQL语句将输出如图3所示的结果。如果将最后一条SQL语句(select * from tt)换成如下的SQL语句,将输出如图2所示的结果。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->select*fromttunpivot([c]fornamein([abc],[xxx],[ttt]))p
要注意的是,[c]中的c表示聚合结果列的字段名,name表示要聚合列的字段名,这两个值可以是任意满足字段名命名规则的字符串,[abc] ,[xxx],[ttt]分别是图3所示的记录集的字段名,这些值必须一致。执行下面的SQL语句将获得图4的输出结果。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->select*fromttunpivot([统计值]for统计名in([abc],[xxx],[ttt]))p
图4
分享到:
相关推荐
本文主要讨论了如何将聚合记录集逆时针和顺时针旋转90度,这是数据分析和报表制作中常见的需求。 首先,我们看一个基本的例子。假设有一个名为`@t`的表,其中包含一个`name`字段,存储了多个重复的字符串。通过以下...
本文主要讨论如何将聚合记录集进行90度的旋转,即逆时针和顺时针旋转,这对于将行转换为列或反之非常有用。 首先,让我们理解基本概念。假设我们有一个记录集,其原始格式是水平排列的,我们可能需要将其转换为垂直...
该书解释并比较了SQL Server 2000和SQL Server 2005在数据库开发相关问题上的解决方案,深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...
SQL Server 2005是微软推出的一款关系型数据库管理系统,具有强大的数据处理能力和高度的可扩展性。这个压缩包包含四本关于SQL Server 2005技术内幕的中文PDF书籍,涵盖了从基础到高级的各个层面,是学习和掌握SQL ...
——《Microsoft SQL Server 2005 技术内幕:T-SQL程序设计》、《Microsoft SQL Server 2005 技术内幕:T-SQL查询》、《Microsoft SQL Server 2005 技术内幕:查询、调整和优化》、《Microsoft SQL Server 2005 技术...
SQL Server 2005微软官方权威参考书. 公球公认SQL Server 2005 经典著作.. 数据库“铁人”、微软MVP胡百敬先生鼎力推荐 微软SQL Server 总部Principal Group 项目经理朱凌志鼎力推荐 本书详细介绍了数据...
Microsoft SQL Server 2005技术内幕: T-SQ程序设计 中文版本的 第一部分 第二部分地址:http://download.csdn.net/source/2680866
Microsoft SQL Server 2005技术内幕:T-SQL查询 pdf 中文版 1 第一部分 第二部分地址:http://download.csdn.net/source/2684248
——《Microsoft SQL Server 2005 技术内幕:T-SQL程序设计》、《Microsoft SQL Server 2005 技术内幕:T-SQL查询》、《Microsoft SQL Server 2005 技术内幕:查询、调整和优化》、《Microsoft SQL Server 2005 技术...
1. 安全性增强:SP4包含了针对SQL Server 2005的安全漏洞的修复,帮助防止潜在的攻击,保护数据库免受恶意软件和其他网络安全威胁。 2. 性能提升:SP4包括对查询处理、存储引擎和整体系统性能的优化,使得SQL ...
Microsoft SQL Server 2005技术内幕:T-SQL查询 pdf 中文版 第二部分 第一部分地址:http://download.csdn.net/source/2684220
SQL Server 2005是微软公司推出的一款关系型数据库管理系统,它在企业级数据管理、分析和报告方面表现出色。这款产品提供了多种版本,包括精简版(Express Edition),适用于小型企业和个人开发者,提供了基本的...
SQL Server 2005是微软公司推出的一款关系型数据库管理系统,它在企业级数据管理、分析和应用开发中扮演着重要角色。SQL Server 2005客户端组件是该系统的一部分,允许用户连接到SQL Server数据库服务器进行查询、...
Microsoft SQL Server 2005 Backward Compatibility Components (Microsoft SQL Server 2005 向后兼容组件) SQL Server Backward Compatibility 包中包含 最新版本的 Data Transformation Services 2000 运行时 ...
1. **增强的数据库引擎**:SQL Server 2005的Transact-SQL引擎进行了优化,提供更快的查询性能和更高的并发处理能力,同时支持更多的数据类型和新的T-SQL函数。 2. **集成的服务**:SQL Server 2005集成了多个服务...
Microsoft SQL Server 2005 Backward Compatibility Components (Microsoft SQL Server 2005 向后兼容组件) SQL Server Backward Compatibility 包中包含最新版本的 Data Transformation Services 2000 运行时 (DTS...
1. **全面的SQL支持**:JDBC驱动支持SQL Server 2005的所有SQL语法,包括复杂查询、存储过程和事务处理。 2. **性能优化**:Type 4驱动通过高效的网络协议与SQL Server通信,降低了延迟并提高了吞吐量。 3. **并发...
Microsoft SQL Server 2005技术内幕: T-SQ程序设计 Microsoft.Press.Inside.Microsoft.SQL.Server.2005.T-SQL.Querying
SQL Server 2005/2008 Express Profiler 是微软SQL Server数据库管理系统中一个强大的性能监视工具,尤其适用于SQL Server 2008 Express版本。它允许开发者和DBA(数据库管理员)深入地洞察数据库系统的运行情况,...