SQL Server2005杂谈(5):将聚合记录集逆时针和顺时针旋转90度

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 本文为原创,如需转载,请注明作者和出处,谢谢!上一篇:SQL Server2005杂谈(4):在SQL Server2005中按列连接字符串的三种方法    在输出统计结果时可能需要将列变成行,而将聚合结果(如count、sum)作为记录的第...

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:SQL Server2005杂谈(4):在SQL Server2005中按列连接字符串的三种方法

    在输出统计结果时可能需要将列变成行,而将聚合结果(如count、sum)作为记录的第一行,先看如下的SQL语句:

declare  @t  table (name  varchar ( 20 ))
insert  @t
select  ' abc '  union  all
select  ' xxx '  union  all
select  ' xxx '  union  all
select  ' ttt '

select  *  from  @t

    在执行上面的SQL语句后,会输出如图1所示的记录集。

图1

    上图显示的是一个普通的记录集,如果要统计name字段的每个值的重复数,需要进行分组,如下面的SQL如示:

select  count (name)  as  c ,name   from  @t  group  by  name 


   
执行上面的SQL语句后的查询结果如图2所示。

图2

    如果我们有一个需求,需要如图3所示的聚合结果。


图3

      从图3可以看出,查询结果正好是图2的结果逆时针旋转90度,也就是说,name列的值变成了列名,而c列的值变成了第一行的记录。图2所示的c和name字段消失了。

    当然,要达到这个结果并不困难,看如下的SQL语句:

select  ( select  count (name)  from  @t  where  name = ' abc ' as  abc, 
       (
select  count (name)  from  @t  where  name = ' ttt ' as  xxx,
       (
select  count (name)  from  @t  where  name = ' xxx ' as  ttt


    上 面的SQL语句会出输出如图3的查询结果。但这里有个问题,上面的SQL语句是枚举了name列所有可能的值,在本例中只有三个值 ('abc','ttt','xxx'),这非常好枚举,但如果有很多值,SQL语句会变得非常长,非常不利于编写。当然,可以通过编程的方式自动生成, 但最终结果仍然会生成很长的SQL语句。
   
为了解决这个问题,在SQL Server2005中提供了一个pivot函数,该函数可以很容易地输出如图3所示的记录集,如下面的SQL语句所示:

select  *  from  @t  pivot( count (name)  for  name  in ( [ 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语句:
declare  @t  table (name  varchar ( 20 ))
insert  @t
select  ' abc '  union  all
select  ' xxx '  union  all
select  ' xxx '  union  all
select  ' ttt '
;
with  tt  as (
select  *  from  @t  pivot( count (name)  for  name  in ( [ abc ]  , [ ttt ] , [ xxx ] )) p)
select  *  from  tt

    上面的SQL语句将输出如图3所示的结果。如果将最后一条SQL语句(select * from tt)换成如下的SQL语句,将输出如图2所示的结果。

select  *  from  tt  unpivot( [ c ]  for  name  in ( [ abc ]  , [ xxx ] , [ ttt ] )) p

    要注意的是,[c]中的c表示聚合结果列的字段名,name表示要聚合列的字段名,这两个值可以是任意满足字段名命名规则的字符串, [abc] ,[xxx],[ttt]分别是图3所示的记录集的字段名,这些值必须一致。执行下面的SQL语句将获得图4的输出结果。

select  *  from  tt  unpivot( [ 统计值 ]  for  统计名  in ( [ abc ]  , [ xxx ] , [ ttt ] )) p



图4


国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
2月前
|
SQL 存储 数据可视化
SQL中文字符旋转90度的处理:技巧、方法与注意事项
在SQL数据库中,直接对文本数据进行90度旋转并不是数据库系统的原生功能
|
4月前
|
SQL 流计算
Flink SQL 在快手实践问题之Window TVF改进窗口聚合功能如何解决
Flink SQL 在快手实践问题之Window TVF改进窗口聚合功能如何解决
37 1
|
5月前
|
分布式计算 BI MaxCompute
SQL 能力问题之输出聚合的维度列的名称,如何解决
SQL 能力问题之输出聚合的维度列的名称,如何解决
|
7月前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
7月前
|
分布式计算 资源调度 Hadoop
Flink报错问题之Sql往kafka表写聚合数据报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
SQL 数据库管理 索引
SQL基础——聚合与排序(下)
SQL基础——聚合与排序(下)
169 0
|
7月前
|
SQL 数据采集 分布式计算
Spark SQL中的聚合与窗口函数
Spark SQL中的聚合与窗口函数
|
7月前
|
SQL 关系型数据库 数据库连接
Hasor【环境搭建 03】Dataway接口配置服务使用DataQL聚合查询引擎(SQL执行器实现分页查询举例说明+报错 Query dialect missing 原因分析及解决)
Hasor【环境搭建 03】Dataway接口配置服务使用DataQL聚合查询引擎(SQL执行器实现分页查询举例说明+报错 Query dialect missing 原因分析及解决)
158 0
|
SQL
SQL基础——聚合与排序(上)
SQL基础——聚合与排序(上)
77 0
|
SQL 测试技术 数据库
软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询
软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询
软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询