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

行列转换的语句求解释
现在项目中用到了行列转换,在网上找到了想要的sql语句,虽然功能是实现了,可是这个语句看不懂很纠结,求高手解释
create table cj  --创建表cj
(
    ID       Int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1
    Name     Varchar(50),   
    Subject  Varchar(50),
    Result   Int,  
    primary key (ID)      --定义ID为表cj的主键      
);

Insert into cj
Select '张三','语文',80 union all 
Select '张三','数学',90 union all
Select '张三','物理',85 union all
Select '李四','语文',85 union all
Select '李四','物理',82 union all
Select '李四','英语',90 union all
Select '李四','政治',70 union all
Select '王五','英语',90

--行列转换
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj
  --把所有唯一的科目的名称都列举出来
Select @sql = @sql+' from cj group by name'
Exec (@sql)
红色的这句话为什么可以产生循环的效果,还有就是'''+Subject+'''这个怎么解读?

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

红色的这句话为什么可以产生循环的效果,还有就是'''+Subject+'''这个怎么解读?

Subject是(select distinct Subject from cj)中的Subject。
执行语句前,select @sql输出下看看拼接好的语句什么样的,就理解了。

Subject是(select distinct Subject from cj)中的Subject。这个我知道
三个单引号是是固定写法还是其他解释


之所以能循环是因为,当在select中用变量时,你的语句中使用了@sql变量,那么语句在执行时,机会有一种循环的效果,也就是把select出来的数据,每次选出1条来,就是进行@sql = @sql + 从select中取出的某条数据的字段值,在你的语句中就是@sql = @sql + subject 这是一种非常经典的sql 写法。

------解决方案--------------------
也就是第一次的时候:

      'sum(case Subject when' 加上 '是表中的第一条记录的subject:数学'  加上  'then Result else 0 end)' 加上'[是表中的第一条记录的subject:数学],'

第二次的时候就是:
       把第一次产生的字符串 'sum(case Subject when '数学' then Result else 0 end) [数学],' 加上第二次产生的字符串。

就是这样产生的最后的语句,关键就是select @变量 = @变量 + 表中字段 from 表,能实现把表中的每条数据中的字段值,加到@变量中去,通过@变量,来实现值的累加
------解决方案--------------------
引用:
这样的解释循环我是明白了,就是不知道'''+Subject+'''的三个单引号是怎么解读的

--> 在动态SQL内部,单引号须用2个单引号表示.