这几天在对pb开发的一个老程序进行优化,因为速度太慢。
检查程序原来是用到了循环,虽然只有不到四千条记录,但一条条循环起来还是比较慢的。(所以,查询记录比较多的情况下,尽量不要用循环!)
解决的办法就是删除循环,全部使用动态sql。
修改程序时,遇到如下问题:
问题一:如何行转列?
行转列是很典型的问题,当然是用case语句!在此不再赘述。
生成结果如下,化验指标是动态生成的列:
车号 化验指标1 化验指标2 化验指标3 化验指标n
001 灰分:0.2 null null
001 null 水分:2.5 null
001 null null 发热量:20
002 灰分:0.3 null null
问题二:对varchar类型的多行记录如何合并成一行?
有了上面的结果集,想生成如下结果:
车号 化验指标1 化验指标2 化验指标3 化验指标n
001 灰分:0.2 水分:2.5 发热量:20
002 灰分:0.3 null null
如果是numeric类型的,多行合并成一行比较简单,直接sum() group by 就可以。或者和上面的问题合二为一,直接select 车号,sum(case ...end) group by 车号。
但问题是,此处是varchar类型的,直接用sum会报错,大概是说sum对varchar不适用。
问题复杂了,在网上查了很多类似的贴子,有的建议新建一合并函数,有的说在sql server 2005中用OUTER APPLY等解决。但我们是sql server 2000,第二种方法显然不适用。
正一筹莫展的时候,突然脑袋灵光一闪:不能用sum,可以用max呀!赶紧测试一下,我成功了!而且速度由原来的15秒提高到8秒!!!这几天没百干啊!
可以说我这个多行合并只是一个特例,因为一个车号每个化验指标只化验一次,如果化验多次那就要用到字符串拼接,就不会如此简单了。
下班,周末愉快!