sql server提供的聚合函数(SQLServer行列互转实现思路聚合函数)
类别:数据库 浏览量:2907
时间:2022-04-02 14:41:01 sql server提供的聚合函数
SQLServer行列互转实现思路聚合函数有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的。
如下:
declare @t table (StudentName nvarchar(20), Subject nvarchar(20), Score int) Insert into @t (StudentName,Subject,Score) values ( '学生A', '中文', 80 ); Insert into @t (StudentName,Subject,Score) values ( '学生A', '数学', 78 ); Insert into @t (StudentName,Subject,Score) values ( '学生A', '英语', 92 ); Insert into @t (StudentName,Subject,Score) values ( '学生B', '中文', 89 ); Insert into @t (StudentName,Subject,Score) values ( '学生B', '数学', 87 ); Insert into @t (StudentName,Subject,Score) values ( '学生B', '英语', 75 ); Insert into @t (StudentName,Subject,Score) values ( '学生C', '中文', 92 ); Insert into @t (StudentName,Subject,Score) values ( '学生C', '数学', 74 ); Insert into @t (StudentName,Subject,Score) values ( '学生C', '英语', 65 ); Insert into @t (StudentName,Subject,Score) values ( '学生D', '中文', 79 ); Insert into @t (StudentName,Subject,Score) values ( '学生D', '数学', 83 ); Insert into @t (StudentName,Subject,Score) values ( '学生D', '英语', 81 ); Insert into @t (StudentName,Subject,Score) values ( '学生E', '中文', 73 ); Insert into @t (StudentName,Subject,Score) values ( '学生E', '数学', 84 ); Insert into @t (StudentName,Subject,Score) values ( '学生E', '英语', 93 ); Insert into @t (StudentName,Subject,Score) values ( '学生F', '中文', 79 ); Insert into @t (StudentName,Subject,Score) values ( '学生F', '数学', 86 ); Insert into @t (StudentName,Subject,Score) values ( '学生F', '英语', 84 ); select StudentName, sum(case when Subject = N'中文' then Score else 0 end) Chinese, sum(case when Subject = N'数学' then Score else 0 end) Math, sum(case when Subject = N'英语' then Score else 0 end) Engilsh from @t group by StudentName
今天看到一个新的写法,pivot 可以实现相同的功能(2005才开始支持)。
pivot 的语法为:
table_source
pivot(聚合函数(value_column) pivot_column for (columnlist))
稍微解释一下:
table_source:是我们要进行转换的表。pivot_column: 就是要进行行转列的列名。value_column:是转换后列的值。columnlist 是要生成的列。
同样是上面的例子,使用pivot 可以这样写得到同样的结果:
select StudentName, [中文] Chinese, [数学] Math, [英语] English from (select * from @t) t1 pivot (sum(Score) for Subject in([中文],[英语],[数学])) t2
与之对应的 unpivot 就是列转行了(列名作为值),
unpivot 的语法为:
table_source
unpivot(value_column ubpivot_column for(columnlist))
参数的意义与pivot 是一样的。这里我们可以简单的把刚刚转后的再转回去,这样就得到原来的表了:
select StudentName, Subject, Score from (select * from @t) t1 pivot (sum(Score) for Subject in([中文],[英语],[数学])) t2 unpivot (Score for Subject in([中文],[英语],[数学])) t3
以上就是本文的全部内容,希望对大家学习实现SQLServer行列互转有所帮助。
您可能感兴趣
- 启动sqlserver代理服务失败(SQL Server代理服务无法启动怎么办)
- sqlserver拒绝访问怎么办(SQL server服务显示远程过程调用失败的解决方法)
- sqlserver纵表变横表(SQL Server行转列的方法解析)
- 怎么写存储过程sql server(SqlServer存储过程实现及拼接sql的注意点)
- sqlserver 添加分区(SQL Server 数据库分区分表水平分表详细步骤)
- sqlserver分表后如何查询(SQL Server中row_number分页查询的用法详解)
- sqlserver 使用SSMS运行sql脚本的六种方法(sqlserver 使用SSMS运行sql脚本的六种方法)
- sqlserver常用流控语句(SQL Server实现自动循环归档分区数据脚本详解)
- sqlserver电脑休眠时断开连接(浅谈sqlserver下float的不确定性)
- 修改sqlserver数据库名称步骤(SQL server数据库创建代码 filegroup文件组修改的示例代码)
- sql server修改sa密码(sqlserver添加sa用户和密码的实现)
- sqlserver日志被删除(sql server日志处理不当造成的隐患详解)
- Windows2012配置SQLServer2014AlwaysOn的图解(Windows2012配置SQLServer2014AlwaysOn的图解)
- sqlserver日志目录是否过大(SQL Server利用sp_spaceused如何查看表记录存在不准确的情况)
- SqlServer类似正则表达式的字符处理问题(SqlServer类似正则表达式的字符处理问题)
- sqlserver数据库还原教程(SQL Server通过重建方式还原master数据库)
- 林心如是谁(林心如是谁演的)
- 泰国安全吗(泰国安全吗2023)
- 菲律宾安全吗(菲律宾安全吗)
- 泰国旅游攻略(泰国旅游攻略必去景点)
- 数字藏品市场有多乱 周杰伦丢了 一只猴 ,损失超300万(数字藏品市场有多乱)
- 这里输入关键词(怎么输入关键词搜索)
热门推荐
- curl怎么设置方法(关于Curl在Swoole协程中的解决方案详析)
- dede织梦怎么在文章下面添加图片(dedecms织梦模板描述description长度限制修改方法)
- 如何布局网站的广告位
- 云服务器和普通服务器有什么区别(云服务器是什么?云服务器是如何工作的?)
- sql server 2019 资源不足不可信(SQL Server异常代码处理的深入讲解)
- react 的事件机制(React如何优雅的捕获异常)
- 怎么用织梦上传源码(如何把织梦dedecms数据生成json)
- sql server代理无法启动服务(SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法)
- php验证码图解(php/JS实现的生成随机密码验证码功能示例)
- dedecms分页修改(Dedecms图片加上Alt和Title等属性的修改方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9