sql server多重行列转置的优化

将表1转化成表2:

表1

表2

得到表2的结果,需要经过多次pivot转换,再经union连接到一起,代码如下:

 1 select id, type,sum([1]) [1],sum([2]) [2],sum([3]) [3],sum([4]) [4] from
 2 (
 3     select ‘a‘ as type, * from   Table_1
 4     pivot(sum(a)  for p in([1],[2],[3],[4])) as a
 5 union all
 6     select ‘b‘ as type,* from   Table_1
 7     pivot(sum(b)  for p in([1],[2],[3],[4])) as b
 8 union all
 9     select ‘c‘  as type,* from   Table_1
10     pivot(sum(c)  for p in([1],[2],[3],[4])) as c
11 union all
12     select ‘d‘  as type,* from   Table_1
13     pivot(sum(d)  for p in([1],[2],[3],[4])) as d
14 ) t1
15 group by id,type
16 order by id,type

此时代码看起来比较多,如果需要n多次pivot转换,代码过于繁多。

此时,可通过定义一个变量,以拼字符串的形式,来代替繁多的代码:

1 declare @str varchar(8000)
2 set @str = ‘‘
3 select  @str = @str + ‘ SELECT ‘‘‘+ NAME + ‘‘‘ AS TYPE,* FROM Table_1 pivot(SUM(‘+ NAME +‘)
4         for p in ([1],[2],[3],[4])) as ‘+ NAME +‘ union ALL ‘
5         from syscolumns
6         where object_id(‘Table_1‘) = id AND NAME <> ‘P‘ AND NAME <> ‘ID‘
7 select @str = left(@str,len(@str)-len(‘union ALL‘))
8 select @str =‘select id, type,sum([1]) [1],sum([2]) [2],sum([3]) [3],sum([4]) [4] from (‘+ @str +‘) t1 group by id,type order by id,type‘
9 exec (@str)

两种方法得出的结果是一样的,只是后者代码更为简洁。

时间: 2024-11-19 08:00:13

sql server多重行列转置的优化的相关文章

SQL Server中行列转置方法

PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现 完整语法: table_sou

SQL Server中行列转换 Pivot UnPivot

SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

SQL Server中行列转换

典型实例 一.行转列 1.建立表格 ifobject_id('tb')isnotnulldroptabletb go createtabletb(姓名varchar(10),课程varchar(10),分数int) insertintotbvalues('张三','语文',74) insertintotbvalues('张三','数学',83) insertintotbvalues('张三','物理',93) insertintotbvalues('李四','语文',74) insertinto

Sql Server随机抽取数据效率优化

Sql Server随机抽取数据效率优化2013-05-11 1 个评论 作者:菜光收藏 我要投稿Sql Server随机抽取数据效率优化 山人我最近遇到一件很纠结的事情,就是如何快速的从数据表里随机抽取一条数据. 我生成了一个简单的数据表,并且导入了500W条数据进行测试. 下图为第一次采用的SQL语句: Declare @d DatetimeSet @d=getdate()SELECT top 1[ActivityID] ,[CardNo] ,[Password] ,[State] ,[Cr

SQL优化工具 - SQL Server Profiler与数据库引擎优化顾问

最近项目做到几千个学生分别去人脸识别记录(目前约630000行)中查询最后一次记录,可想而知性能这块是个麻烦.于是乎,GET到了SQL Server Profiler和数据库引擎优化顾问这俩工SHEN具QI. 开始装逼... 首先来一条执行效率不怎么样的SQL语句 将SQL Server Profiler中的跟踪文件保存至本地 打开数据库优化引擎,选择工作负荷文件以及需要优化的数据库/表,点击开始分析 分析结束后会给你索引建议,执行操作→应用建议,将会自动生成SQL语句并执行,完成后再执行试试那

sql server动态行列转换

原文链接:https://www.cnblogs.com/gaizai/p/3753296.html sql server动态行列转换 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL,动态列字段: 方法三:使用PIVOT关系运算符,静态列字段: 方法四:使用PIVOT关系运算符,动态列字段: 扩展阅读一:参数化表名.分组列.行转列字段.字段值:

SQL Server集成服务最佳实践:语句优化

SQL Server集成服务(SQL Server Integration Services,SSIS)在其前辈DTS(Data Transformation Services,数据转换服务)的根基上进步了不少,从可用性.性能和并行等方面来说,它已经成长为一个企业级ETL(Extraction, Transformation and Loading,抽取.转换和加载)产品,除了是一个ETL产品外,它也供给了各种内置任务来管理SQL Server实例.虽然SSIS的内部架构已经被设计为供给极好的性

Sql Server CPU 性能排查及优化

注明出处:http://www.cnblogs.com/xunziji/archive/2011/07/27/2118063.html --Begin Cpu 分析优化的相关 Sql --使用DMV来分析SQL Server启动以来累计使用CPU资源最多的语句.例如下面的语句就可以列出前50名. select c.last_execution_time,c.execution_count,c.total_logical_reads,c.total_logical_writes,c.total_e

SQL SERVER执行计划和索引优化基础

一.如何打开执行计划? 在Microsoft SQL Server Management Studio中打开"包括实际的执行计划"(快捷键:Ctrl+M),执行SQL语句就可以看到实际的执行计划(图文格式,非常直观),这无疑是最友好的查阅方式. 二.如何看懂实际执行计划? 执行复杂的脚本之后,看到的执行计划,很多人直接懵圈了,这些图文到底是什么含义呢,又该如何优化呢? 下面将列举常见的执行计划操作: Table Scan(全表扫描):如果你的表数据量非常小,表扫描是可以的,并且可能性能