飘飘悠悠 发表于 2015-1-16 14:18:46

Sql Server中Pivot函数详解

MySQL最初的开发者的意图是用mSQL和他们自己的快速低级例程(ISAM)去连接表格。经过一些测试后,开发者得出结论:mSQL并没有他们需要的那么快和灵活。在SqlServer的匡助文档中,对Pivot函数是如许注释的:
可使用PIVOT和UNPIVOT干系运算符对表值表达式举行操纵以取得另外一个表。PIVOT经由过程将表达式某一列中的独一值转换为输入中的多个列来转换表值表达式,并在需要时对终极输入中所需的任何其他的列值实行聚合.

对第一次利用PIVOT函数的伴侣来讲,如许的注释很难让人人了解,上面编纂用PIVOT函数来完成一个行转列的功效,以便让读者更简单了解该函数.

注重:PIVOT是SqlServer2005的新函数,2005前行转列请参看本站:
SQLServer中(行列转换)行转列及列转行且加均匀值及汇总值

先创立一个人为表:
CreateTableSalary
(
HrNamevarchar(50),
Monthlyvarchar(50),
Moneymoney
)

往表中拔出数据:
insertintoSalary(HrName,Monthly,)
select张三,一月,3000
unionall
select张三,仲春,3200
unionall
select张三,三月,3500
unionall
select李四,一月,3800
unionall
select李四,仲春,4200
unionall
select李四,三月,3900
unionall
select张三,一月,2000

检察一般的数据:
select*fromSalary

了局:
HrNameMonthlyMoney
张三一月3000.00
张三仲春3200.00
张三三月3500.00
李四一月3800.00
李四仲春4200.00
李四三月3900.00
张三一月2000.00


检察行转列后的数据:
selectHrNameas姓名,[一月],[仲春],[三月]fromSalary
pivot(sum()forMonthlyin([一月],[仲春],[三月]))aspvt

了局:
姓名一月仲春三月
李四3800.004200.003900.00
张三5000.003200.00500.00


注重:
pivot(sum()forMonthlyin([一月],[仲春],[三月]))中的sum(),这里必需是聚合函数,好比是min,max等。
in([一月],[仲春],[三月])中的[一月],[仲春],[三月]即为Monthly的Value,又为新了局集的列名.

假如我们将个中的一月改成四月,由于数据源中没有四月的纪录,以是四月查询出来应当为Null.
测试:
selectHrNameas姓名,[四月],[仲春],[三月]fromSalary
pivot(sum()forMonthlyin([四月],[仲春],[三月]))aspvt

了局:
姓名四月仲春三月
李四NULL4200.003900.00
张三NULL3200.003500.00


以上为编纂团体了解小结,仅作参考!因此,我们的第一个“米”,就是二进制日志binlog必须是rowbased的。在rowbase下,二进制日志binlog同时记录了更新前后的整行记录。

乐观 发表于 2015-1-18 12:43:21

代替了原来VB式的错误判断。比Oracle高级不少。

小魔女 发表于 2015-1-25 18:02:49

同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。

小妖女 发表于 2015-2-3 12:51:06

索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。

老尸 发表于 2015-2-9 02:51:37

代替了原来VB式的错误判断。比Oracle高级不少。

变相怪杰 发表于 2015-2-26 19:35:39

是要和操作系统进行Socket通讯的场景。否则建议慎重!

海妖 发表于 2015-3-8 17:20:33

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

深爱那片海 发表于 2015-3-16 08:16:49

两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书

爱飞 发表于 2015-3-22 21:50:49

你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
页: [1]
查看完整版本: Sql Server中Pivot函数详解