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

打雷了,下雨了,刮风收衣服拉
各位大虾你们好:
一个很简单的动态sql问题,求求各位帮帮我,分数不多,一点心意

--创建测试环境
Create   table     T     (Class   varchar(2),CallDate   datetime,   CallCount   int)
insert   into   T   select   '1 ', '2005-8-8 ',40
union   all   select   '1 ', '2005-8-7 ',6
union   all   select   '2 ', '2005-8-8 ',77
union   all   select   '3 ', '2005-8-9 ',33
union   all   select   '3 ', '2005-8-8 ',9
union   all   select   '3 ', '2005-8-7 ',21
--动态SQL
declare   @s   varchar(8000)
set   @s= 'select   CallDate   '
select   @s=@s+ ',[CallCount '+Class+ ']=sum(case   when   Class= ' ' '+Class+ ' ' '   then   CallCount   else   0   end) '
from   T
group   by   Class
set   @s=@s+ '   from   T   group   by   CallDate   order   by   CallDate   desc   '
exec(@s)


我看不懂的是:select   @s=@s+ ',[CallCount '+Class+ ']=sum(case   when   Class= ' ' '+Class+ ' ' '   then   CallCount   else   0   end) '这一句。
即使结合执行结果,还是一头雾水,能不能告诉我这句话的意思啊?
最好能够翻译一下,呵呵。


------解决方案--------------------
select @s=@s+ ',[CallCount '+Class+ ']=sum(case when Class= ' ' '+Class+ ' ' ' then CallCount else 0 end) '
from T group by Class
-----------------------这才是完整的语句
select Class from T group by Class 先抽取基本语句,这你能看懂吧
查询出的class和前后的字符串赋给变量@s,因为有多条语句,所以每条语句都会来一次赋值,
若没有 @s+ 只会把最后的class赋给变量
但有了这个,就会每次把变量累加起来,第一个class处会得到显示名称的后缀1,2,3之类
第二个class值放到了case when的条件值中
set @s 、select @s 、set @s 构成了一个完整的查询语句,你还可以print出来看个明白
------解决方案--------------------
多条语句,所以每条语句--多行记录,每行记录
抽取基本语句也很简单,在查询分析器中颜色不一样
------解决方案--------------------
--动态SQL
declare @s varchar(8000)
set @s= 'select CallDate '
select @s=@s+ ',[CallCount '+Class+ ']=sum(case when Class= ' ' '+Class+ ' ' ' then CallCount else 0 end) '
from T
group by Class
print @s
set @s=@s+ ' from T group by CallDate order by CallDate desc '
exec(@s)

在后面加多一个print @s 这样对你的理解会多点,上面以说出了,
如果还不明,先理解

select @s=@s+Class+ '我是字符 ' from T group by Class 这句

------解决方案--------------------
如楼上的,加个PRINT 就可以理解之所以了。