create table #temp
(
serviceid int,
servicename varchar(100),
vendoramt money,
inidx int
)--生成测试数据
insert into #temp(serviceid, servicename, vendoramt, inidx)
select 0, 'Rent', 1000, 10
union
select 0, 'Processing Fee', 100, 30
union
select 0, 'Damage Waiver Fee', 200, 20declare @blockout varchar(5000)
set @blockout = ''--用select来作累加操作
select @blockout = @blockout + '<tr><td nowrap class=n>' 
+ servicename  + '</td><td align=right class=m>$' 
+ convert(varchar, isnull(vendoramt, 0), 1) + '</td></tr>'from(
select top 100 PERCENT isnull(t.servicename, '')  servicename, sum(t.vendoramt) vendoramt
from #temp t 
group by t.servicename, t.serviceid, t.inidx
order by isnull(t.inidx, 10000)
) tmpprint @blockoutdrop table #temp以上代码在2000下可以得到正确的结果:
<tr><td nowrap class=n>Rent</td><td align=right class=m>$1,000.00</td></tr>
<tr><td nowrap class=n>Damage Waiver Fee</td><td align=right class=m>$200.00</td></tr>
<tr><td nowrap class=n>Processing Fee</td><td align=right class=m>$100.00</td></tr>但是在2005却得到以下结果:
<tr><td nowrap class=n>Damage Waiver Fee</td><td align=right class=m>$200.00</td></tr>
<tr><td nowrap class=n>Processing Fee</td><td align=right class=m>$100.00</td></tr>
<tr><td nowrap class=n>Rent</td><td align=right class=m>$1,000.00</td></tr>请问大家有没有什么好方法来解决此问题,因为公司有两服务器,分别用2000和2005的,当然这里排除游标...

解决方案 »

  1.   

    select @x=@x + 列名 from 表 [order by .....]
    这种查询的结果顺序本来就是不确定的。
      

  2.   

    我这里的 [ ] 指不是必须的意思,像 <>指必须。 而不是作为标识符的定界符来用。
      

  3.   

    实现这种累加,一般三种方式:select @x=@x + colX from tb --order by 这里有不确定因素,某些行为可能导至查询计划变更,因此结果的顺序不能保证
    select @x=@x + colX from tb with(index=在要order by的列上建的索引) --这种方式可以保证顺序
    sql2005下还可以用xml方式,
    具体语句我不写了,可以参考[推荐/精华]里的 roy_88的整理贴。行列互转。