现在的位置: 首页 > 综合 > 正文

SQL Server varchar类型行转列及多行合并问题20090814

2018年02月07日 ⁄ 综合 ⁄ 共 853字 ⁄ 字号 评论关闭

这几天在对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秒!!!这几天没百干啊!

 

可以说我这个多行合并只是一个特例,因为一个车号每个化验指标只化验一次,如果化验多次那就要用到字符串拼接,就不会如此简单了。

 

下班,周末愉快!

 

 

 

抱歉!评论已关闭.