日期:2014-05-18  浏览次数:20509 次

初学者:解释一下SQL语句
刚刚学习SQL有很多不明白的地方
在网上看到这样一个事例,但是有很多地方不理解,请朋友们帮着讲解一下:

假设有张学生成绩表(CJ)如下
Name         Subject           Result
张三         语文                 80
张三         数学                 90
张三         物理                 85
李四         语文                 85
李四         数学                 92
李四         物理                 82

想变成        
姓名       语文       数学       物理
张三       80           90           85
李四       85           92           82

执行代码如下:
declare   @sql   varchar(4000)
set   @sql   =   'select   Name '
select   @sql   =   @sql   +   ',sum(case   Subject   when   ' ' '+Subject+ ' ' '   then   Result     end)   [ '+Subject+ '] '
from   (select   distinct   Subject   from   CJ)   as   a
select   @sql   =   @sql+ '   from   CJ   group   by   name '
exec(@sql)
有些地方看不懂,能不能详细讲解一下这个执行语句.谢谢了


------解决方案--------------------
declare @sql varchar(4000)--声明变量
set @sql = 'select Name '--变量赋值
---(移出)
select @sql = @sql+ ' from CJ group by name '--变量赋值(串连接)
exec(@sql)--执行动态语句
----
select @sql = @sql + ',sum(case Subject when ' ' '+Subject+ ' ' ' then Result end) [ '+Subject+ '] '
from (select distinct Subject from CJ) as a--可分解为下面两句
select Subject,Subject from (select distinct Subject from CJ) as a
select @sql = @sql + '字串 '
---即每行数据会将查询结果串接到@sql变量中
--再用print(@sql)打印出结果就更明白了
------解决方案--------------------
你用PRINT @sql
打印出来就一目了然了!
------解决方案--------------------
print @sql 打印出来看看就明白了.
------解决方案--------------------
declare @sql varchar(4000)
set @sql = 'select Name '
select @sql = @sql + ',sum(case Subject when ' ' '+Subject+ ' ' ' then Result end) [ '+Subject+ '] '
from
--(select distinct Subject from chengji) as a(这句可以直接用tablename代替效果一样)
tablename
select @sql = @sql+ ' from chengji group by name '
print @sql
exec(@sql)

------解决方案--------------------
明明可以用SELECT建一个临时表插入再UPDATE的,搞那么麻烦
------解决方案--------------------
declare @sql varchar(4000)
set @sql = 'select Name '
select @sql = @sql + ',sum(case Subject when ' ' '+Subject+ ' ' ' then Result end) [ '+Subject+ '] '
from CJ group by Subject--这样也可
select @sql = @sql+ ' from CJ group by name '
exec(@sql)