日期:2014-05-17  浏览次数:20838 次

SQL-Server难题,大神们来围观吧
最近在学习列转行,在网上看了很多例子,还是没完全弄懂,自己临时建的一个表
表名tstu
name       kec       scores
张三      语文       98
张三      数学       23
张三      物理       89
李四      语文       89
李四      数学       56
李四      物理       57

下面的SQL语句是我找到觉得比较简单,很实用的,可能对初学者有帮助
select* from tstu pivot(max(corde)for kec in(语文,数学,物理))a  //静态SQL查询

declare @sql varchar(8000)        //动态SQL查询
set @sql=''   
select @sql=@sql+','+kec from tstu group by kec 
set @sql=stuff(@sql,1,1,'') 
set @sql='select * from tstu pivot (max(corde) for kec in ('+@sql+'))a'
exec(@sql)

现在我碰到的问题是, 我需要查询的表有很多列,我只需要其中的几列然后转换成行,用上面的方法也行不通,。。好比你把上面的表tstu再添加一列,但是添加的这一列我不需要查询出来,select*当然不对啦,
而且我要查询的是子表,是把一个子表的列转换成行,我把子表的查询语句直接替换tstu也不对。。 这是为什么呢,, 求大神详解。。。 

------解决方案--------------------
1.行转列?实际应用太少遇得到,展示技术还行,实际应该没什么大用.
2.用拼语句的方式使用行转列?效率太低了,不如好好琢磨如何建一些更优化的表.
3.除了数据库外,你不是还有你的程序设计,有些东西,用SQL不一定好,而在你用你的程序设计语言里,根本就不是个问题,基本算法而已.
------解决方案--------------------
动态拼接sql
------解决方案--------------------
我的意思是,先在with里面把你需要转换的3列取出来,放到一个中间集里面,然后后面的代码只对中间集操作,这样就算select *都没所谓,你试过没?