try:
declare @sql varchar(8000)
set @sql = 'select goodsid'
select @sql = @sql + ',sum(case storeid when '''+storeid+''' then quantity end) ['+storeid+']'
 from (select distinct storeid from onhand) as a
select @sql = @sql+' from onhand group by goodsid'
exec(@sql)

解决方案 »

  1.   

    --如果仓库多,可以会出错,这时可以改用下面的方法,可以有效的解决这个问题
    declare @sqlhead varchar(8000),@sqlend varchar(8000)
    ,@sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000),@sql4 varchar(8000)
    ,@i int,@ic varchar(20)--生成数据处理临时表
    select id=identity(int,0,1),gid=0
    ,a=',['+name+']=sum(case goodsid when '
    +cast(goodsid as varchar)+' then quantity else 0 end)'
    into # from goods--判断需要多少个变量来处理
    select @i=max(len(a)) from #
    set @i=7800/@i--分组临时表
    update # set gid=id/@i
    select @i=max(gid) from #--生成数据处理语句
    select @sqlhead='''select 商品名称=a.name'''
    ,@sqlend=''' from store a inner join onhand b on a.storeid=b.storeid group by a.name'''
    ,@sql1='',@sql2='select ',@sql3='',@sql4=''while @i>=0
    select @ic=cast(@i as varchar),@i=@i-1
    ,@sql1='@'+@ic+' varchar(8000),'+@sql1
    ,@sql2=@sql2+'@'+@ic+'='''','
    ,@sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic
    +char(13)+@sql3
    ,@sql4=@sql4+',@'+@icselect @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13)
    ,@sql2=left(@sql2,len(@sql2)-1)+char(13)
    ,@sql3=left(@sql3,len(@sql3)-1)
    ,@sql4=substring(@sql4,2,8000)--执行
    exec( @sql1+@sql2+@sql3+'
    exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'
    )--删除临时表
    drop table #
      

  2.   

    可以参考:
    http://expert.csdn.net/Expert/topic/2303/2303308.xml?temp=.9494745