今天因为项目需要做一个 采购单价分析报表..所以要用 sql拼出报表的数据源(注:需要行转列)..
最开始原本打算 用拼sql串的方式实现(ps:当时不知道2005新增了 pivot),结果做好了之后发现 性能太差了. ...没办法只有舍弃
然后就努力的百度-谷歌 搜索 --最后发现 sql 2005新增了 pivot 这个东西....
接着就研究了一下. . 最开始看sql帮助文档. .看了一会 没看出了所以然来. 最后还是自己摸索;
代码:
select GID,[0],[1],[2]
from
(select GID,BName,countBID form 表) as A
Pivot
(
max(BName)
for countBID in
(
[0],[1],[2]
)
) as piv
上面是我写的 sql 语句代码
首先 我们来看 (select GID,BName,countBID form 表) as A
这里 其实有一个隐藏的 group by 语句...也就是说 当你Pivot 里面的 max(BName) 使用的聚合的时候 就是 用的这条语句里面的列来划分;例如上面的 就是根据 GID 和 BName来分组的; 我当时调了很久才发现...
在来 我们看Pivot 里面的语句 max(BName) 这个不用说了. 大家都知道了....数学函数
下一句:
for countBID in
for countBID in 中的countBID这个列 作用:他就是我们行转列的依据..也就是 我们要把countBID里面的数据 全部装换成列...for就是循环. 有多少行就循环多少次..只要有一个不同的countBID列值 就在查询里增加一列....
最后 我们来看 [0],[1],[2] 这几个是列名 这里值得注意的是:这些列名必须是 countBID列里面的数据...如果不是就会报错.....
这里也限制了 行转列的 增加多少列.....例如上面的 [0],[1],[2] 也就是 只是将countBID里面的0,1,2的数据转换成列,其他的就不会..
--------------------------------------------------------------------
好了 就这样了. .写的不够好哈..不好意思. .....希望大家多提意见...第二次写博客!手还是一直颤抖....
(
[0],[1],[2]
)