日期:2014-05-16  浏览次数:20671 次

求高手帮忙看一下这条SQL语句应该如何改写呢?谢谢!
本帖最后由 limx001 于 2014-05-07 12:07:11 编辑
原始表结构为:
A01       A02        A03   A04  A05  A06  A07  A08  A09
同意      不同意     ...
不同意    同意
同意      非常不同意
同意      不同意
一般      同意

要求变为:
CNO      非常同意   同意  一般  不同意  非常不同意
A01       5         10       3     4      2
A02       2         12       4     0      0
A03       ...       ...         
A04
A05
A06
A07
A08
A09


我是这样写: 
declare @i int
set @i=1
while @i<10
begin

insert into testTotal(CNO,Genok,VYes,Yes,NNo,VNO)
  select a.[A0+cast(@i as nvarchar(1)],
  sum(a.一般) as 一般,sum(a.非常同意) as 非常同意,sum(a.同意) as 同意, 
  sum(a.不同意) as 不同意,sum(非常不同意) as 非常不同意
  from (select 'A0'@i as a0@i,sum(iif(A0@i='一般',1,0)) as 一般,
  sum(iif(A0@i='非常同意',1,0)) as 非常同意,
  sum(iif(A0@i='同意',1,0)) as 同意,
  sum(iif(A0@i='不同意',1,0)) as 不同意,
  sum(iif(A0@i='非常不同意',1,0)) as 非常不同意
   from testtable group by A0@i ) a group by a.A0@i

set @i=@i+1
end

上面出错总是在  @i , 也没有 a.[A0+...] 的这样搞法,但不知如何改,求高手指点,谢谢!
------解决方案--------------------
declare @i int
set @i=1
declare @s varchar(8000)
set @s=''
while @i<10
begin

set @s=@s+'
insert into testTotal(CNO,Genok,VYes,Yes,NNo,VNO)
  select a.[A0'+cast(@i as nvarchar(1))+'],
  sum(a.一般) as 一般,sum(a.非常同意) as 非常同意,sum(a.同意) as 同意, 
  sum(a.不同意) as 不同意,sum(非常不同意) as 非常不同意
  from (select ''A0'+cast(@i as nvarchar(1))+' as a0@i,sum(iif(A0'+cast(@i as nvarchar(1))+'=''一般'',1,0)) as 一般,
  sum(iif(A0'+cast(@i as nvarchar(1))+'=''非常同意'',1,0)) as 非常同意,
  sum(iif(A0'+cast(@i as nvarchar(1))+'=''同意'',1,0)) as 同意,
  sum(iif(A0'+cast(@i as nvarchar(1))+'=''不同意'',1,0)) as 不同意,
  sum(iif(A0'+cast(@i as nvarchar(1))+'=''非常不同意'',1,0)) as 非常不同意
   from testtable group by A0'+cast(@i as nvarchar(1))+' ) a group by a.A0@i'

set @i=@i+1
end
print @s

------解决方案--------------------
别名是不能作为分组条件的  'A0'+cast(@i as nvarchar(1) 本来这是没问题的 但是你到后面就一律用别名了