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

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也不对。。 这是为什么呢,, 求大神详解。。。 

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



 大神无处不在呀,, 加个where条件来筛选?不会耶, 我还是菜鸟, 大神能否给出SQL语句?
------其他解决方案--------------------
引用:
1.行转列?实际应用太少遇得到,展示技术还行,实际应该没什么大用.
2.用拼语句的方式使用行转列?效率太低了,不如好好琢磨如何建一些更优化的表.
3.除了数据库外,你不是还有你的程序设计,有些东西,用SQL不一定好,而在你用你的程序设计语言里,根本就不是个问题,基本算法而已.
   又来了一位大神呀, 鸡冻。。。  你说的很对,, 转来转去的,都纠结死啦, 不过没办法,现在改数据库来不及啦,, 我只能去转啦,, 我学这个不是要展示技术,, 头都搞大啦,,
------其他解决方案--------------------
引用:
动态拼接sql
  同样又看到你啦,,, 不过我看你连接的帖子,写的更加复杂耶,,我理解能力差没看懂
------其他解决方案--------------------
2005以后的用法,仅仅是举例:
declare @sql varchar(8000)        //动态SQL查询
set @sql='' 
;with huang as 
(
select 你需要的列名
from tb
)  
select @sql=@sql+','+kec from huang group by kec 
set @sql=stuff(@sql,1,1,'') 
set @sql='select * from huang pivot (max(corde) for kec in ('+@sql+'))a'
exec(@sql)


------其他解决方案--------------------