2012-11-29 24 views
0

我正在嘗試獲取報表的水平總和。目前使用動態查詢和數據透視表。下面是我的代碼動態列的水平總和

聲明@cols爲nvarchar(最大) 聲明@pvt_cols爲nvarchar(最大) 聲明@sqlquery爲nvarchar(最大)

select @cols= Coalesce(@cols+',','') 
    + 'Coalesce([' +MonthYR+ '],0) AS [' + MonthDescription +'] ' 
      ,@pvt_cols=coalesce(@pvt_cols +',','') +' ['+[MonthYR] +']' 
from @Calendar 
where CASDT between '20110401' and '20111230' (generates column with month headers) 

print @cols  
print @pvt_cols 
print '--------------------' 


Set @sqlquery='Select ProdDesc,'[email protected] + ',Total 
      from (Select ProdDesc, 
        MonthYr, 
        NetAmount, 
        SUM(NetAmount) over (partition by ProdDesc) as Total 
      from #Comtempt1 
      ) as dat 
        pivot(
      SUM(NetAmount) for MonthYr in 
      (' + @pvt_cols + '))pvt' 

print @sqlquery 

exec sp_executesql @sqlquery 

我能夠得到總,但它顯示的總爲整個記錄,而我只需要根據用戶輸入的日期得到總數。

回答

0
declare @cols nvarchar(max) declare @pvt_cols nvarchar(max) declare @sqlquery nvarchar(max) 
declare @total nvarchar(max) 
select @cols= Coalesce(@cols+',','') 
    + 'Coalesce([' +MonthYR+ '],0) AS [' + MonthDescription +'] ' 
      ,@pvt_cols=coalesce(@pvt_cols +',','') +' ['+[MonthYR] +']' 
      ,@total= Coalesce(@total+'+','') + 'Coalesce([' +MonthYR+ '],0)' 
from @Calendar 
where CASDT between '20110401' and '20111230' (generates column with month headers) 

print @cols  
print @pvt_cols 
print '--------------------' 


Set @sqlquery='Select ProdDesc,'[email protected] + ',' + @Total + ' Total 
      from (Select ProdDesc, 
        MonthYr, 
        NetAmount, 
        SUM(NetAmount) over (partition by ProdDesc) as Total 
      from #Comtempt1 
      ) as dat 
        pivot(
      SUM(NetAmount) for MonthYr in 
      (' + @pvt_cols + '))pvt' 

print @sqlquery 

exec sp_executesql @sqlquery 
+0

我試過了你的查詢,但它只複製了@cols的值我需要添加一個Total列。 這是截圖http://i85.photobucket.com/albums/k42/esr0159/sss-1.jpg – error1692

+0

那麼,屏幕截圖中的「總計」列在哪裏?什麼'print @ sqlquery'顯示? – RichardTheKiwi

+0

我需要補充說,無論如何,我現在能夠創建一個新的查詢。呃您發佈的新「@sqlquery」重複了@cols列中的值。儘管如此,感謝您的幫助:) – error1692