sql 2005固定列实现过程:
select category,isnull(south,0)as south,isnull(northeast,0)as northeast,isnull(midwest,0) as midwest,isnull(west,0) as west,isnull(south,0)+isnull(northeast,0)+isnull(midwest,0)+isnull(west,0) as total from (select category,amount,region from rawdata)as sq
pivot(sum(amount) for region in ([south],[northeast],[MidWest],[West])) as pt
结果:
category    south  northeast  midwest    West      total
  X     165     0        24    36     225
  Y     287    181        38     0     506
  Z     33     55        83    44     215
sql 2005动态实现过程:
DECLARE @XColumns NVARCHAR(1024)
SET @XColumns=''
SELECT  @XColumns=@XColumns+[a].[column]+', '
FROM (SELECT DISTINCT Region as [column] FROM RawData) as aSET @XColumns=LEFT(@XColumns,len(@XColumns)-1)

SET @XColumns='SELECT Category,'
+@XColumns
+' FROM (select category,region,amount from rawdata) as b PIVOT (sum(amount) for region in ('+@XColumns+')) as pt'
exec sp_executesql @XColumns
结果:
cateogry  midwest  northeast     south   west
   X       24     NULL   165   36
   Y      38     181           287   NULL
   Z      83      55            33   44
问题是:如果将Null改为0再加上total和固定列显示的效果一样,谢谢

解决方案 »

  1.   

    DECLARE    @XColumns NVARCHAR(1024)
    DECLARE    @Fields NVARCHAR(1024)
    SET @Fields=''
    SELECT  
    @Fields=@Fields+',isnull('+[a].[column]+',0) '
    ,@XColumns=isnull(@XColumns+',','')+[a].[column]
        FROM (SELECT DISTINCT Region as [column] FROM RawData) as a    
    SET @XColumns='SELECT Category'
        +@Fields
        +' FROM (select category,region,amount from rawdata) as b PIVOT (sum(amount) for region in ('+@XColumns+')) as pt'
    exec sp_executesql @XColumns
      

  2.   

    少合计DECLARE    @XColumns NVARCHAR(1024)
    DECLARE    @Fields NVARCHAR(1024)
    DECLARE    @Total NVARCHAR(1024)SET @Fields=''
    SELECT  
    @Fields=@Fields+',isnull('+[a].[column]+',0) '
    ,@Total=isnull(@Total+'+','')+'isnull('+[a].[column]+',0) '
    ,@XColumns=isnull(@XColumns+',','')+[a].[column]
        FROM (SELECT DISTINCT Region as [column] FROM RawData) as a    
    SET @XColumns='SELECT Category'
        +@Fields
        +','+@Total+' as total'
        +' FROM (select category,region,amount from rawdata) as b PIVOT (sum(amount) for region in ('+@XColumns+')) as pt'
    exec sp_executesql @XColumns