仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 886|回复: 8
打印 上一主题 下一主题

[学习教程] Sql Server中Pivot函数详解

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:18:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

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

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

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

往表中拔出数据:
insertintoSalary(HrName,Monthly,[Money])
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([Money])forMonthlyin([一月],[仲春],[三月]))aspvt

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


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

假如我们将个中的一月改成四月,由于数据源中没有四月的纪录,以是四月查询出来应当为Null.
测试:
selectHrNameas姓名,[四月],[仲春],[三月]fromSalary
pivot(sum([Money])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的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
老尸 该用户已被删除
5#
发表于 2015-2-9 02:51:37 | 只看该作者
代替了原来VB式的错误判断。比Oracle高级不少。
变相怪杰 该用户已被删除
6#
发表于 2015-2-26 19:35:39 | 只看该作者
是要和操作系统进行Socket通讯的场景。否则建议慎重!
海妖 该用户已被删除
7#
发表于 2015-3-8 17:20:33 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
深爱那片海 该用户已被删除
8#
发表于 2015-3-16 08:16:49 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
爱飞 该用户已被删除
9#
发表于 2015-3-22 21:50:49 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 00:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表