pivot的用法(SQL SERVER 2005以上)

OA系统听过木有?OA流程知道吧??OA系统都会有流程,而流程就需要有表单(也就是流程中需要提交的数据).这些表单会因流程的不同而不同.怎么个不同法呢,举个例吧:假如我需要通过OA系统来申请一个请假流程,那么在这个流程中,我可能要填到一个表单(也叫选项):请假原因.同样的,假如我需要申请一个加班流程的话,那么在这个流程当中,我理所当然的要填一个表单:加班原因.

做过web表单的人都清楚,这些数据是要存到数据表里面的,一般来说我们储存的形式应该如下面两幅图所示:

图一:请假表(test_qingjia)

 

图二:加班表(test_jiaban)


        好了,很普通的表.那如果我们的表单某一天需要变更呢?比如新增一个字段,又或删掉一个字段,是用Alter语法来修改表吗??新增还好说,万一要删除呢?数据不就完蛋啦???用标识?你怎么告诉系统哪个字段是要显示出来的,哪里数据是暂时停用的??用另一张表把这些字段名称都存着?然后select的时候不select * 而select [...]??好想法,不过这也太麻烦了.那咋办啊?看标题...
        没错,广大淫民群众的福音到了,下面要介绍的东西就是为了解决上面的难题的.实际上,OA系统中一般来说会有两张表,一张是用来存放流程的名称、新建的日期、新建人啊、流程主键等等信息,然后会在另外一张表存放对应的表单字段等等信息。第一张表就不说了,我只说第二张表的,我只以请假表为例子说明一下,先上图。

图三:OA系统中的请假表单字段存放形式(表名:table_test)

        好了,图看完了没有,这就是字段的存放方式了。那怎么样从这个鸟得到图一的输出呢??直接贴上代码好了,如下:至于pivot的用法,最好意会,懒得言传,详见百度。

select id,[姓名],[開始時間],[結束時間],[請假原因]
from (
select id,names,colvalue
from table_test
) as table1 pivot (max(colvalue) for names in([姓名],[開始時間],[結束時間],[請假原因])) as col1

         执行结果如下:

 图四: 输出结果

 

        注:为了好说明,我直接把字段名称建成了中文的,另外,由于我的系统都是繁体版的,输入简体有乱码,无奈之下,截图的时候看到的都是繁体,有看不懂的小朋友可以Q我一下,我帮忙翻译一下,由于本人目前能力实在有限,所以只能向广大的女性朋友翻译,还提供上门服务,让您感到真正的贴心、放心和省心。

        另外,那个字段的type估计还有别的用法的吧,只是我也是昨天刚接触,还没深入了解,所以也不献丑了,各位不防自己试试?知道用法的也可以在这里留言。

         最后,甩一句:只有想不到,没有做不到。

原文地址:https://www.cnblogs.com/seasons1987/p/2567927.html