2015-04-27 22 views
2

我已經開發了財政年度數據財政年度明智直到現在我已經實現了!但我無法得到逐列平均通過使用T-sql和Pivot的平均列方式

我的表定義

CREATE TABLE [dbo].[tblact] (
    [Id]     INT    NOT NULL, 
    [years]    NVARCHAR (MAX) NULL, 
    [months]    NVARCHAR (MAX) NULL, 
    [expenses]   DECIMAL (18, 2) NULL, 
    [closingbal]   DECIMAL (18, 2) NULL, 
    [monthorder]   INT    NULL 

我的查詢

CREATE PROCEDURE fiscalyear 
AS 
DECLARE @qstr AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 
declare @sql nvarchar(max) 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(years)FROM (SELECT DISTINCT years FROM tblact) AS years; 
    SET @qstr ='SELECT months, ' + @ColumnName + ',total,average FROM 
    (SELECT months, years, expenses,avg(expenses) over(partition by months) average,sum(expenses) over (partition by months) total ,monthorder FROM tblact) AS p 
    PIVOT(SUM(expenses) FOR years IN (' + @ColumnName + ')) AS PVTTable order by monthorder '; 
    EXEC sp_executesql @qstr 

請請你幫助acheive答案

我現在輸出:

Months | 2009-2010 | 2010 - 2011 | 2012-2013 | Total | Average 
-------------------------------------------------------------- 
April | 2000  | 3000  | 4000  | 9000 | 3000 
MAY | 2000  | 3000  | 4000  | 9000 | 3000 
-------------------------------------------------------------- 

期望輸出

Months | 2009-2010 | 2010 - 2011 | 2012-2013 | Total | Average 
-------------------------------------------------------------- 
April | 2000  | 3000  | 4000  | 9000 | 3000 
MAY | 2000  | 3000  | 4000  | 9000 | 3000 
-------------------------------------------------------------- 
Average| 2000  | 3000  | 4000  | 9000 | 3000 

請幫助!

+0

http://stackoverflow.com/questions/14478361/sum-with-sql-server-rollup-but-only-last-summary – mohan111

+0

我想不出我們在那裏我可以添加查詢我明白我需要使用ROLLUP,我應該在哪裏添加,請幫助! – Prhem

+0

將當前查詢的結果存儲在表變量中,然後平均值僅爲SUM除以每列的COUNT值。 –

回答

1

我清理了一下你的代碼。我只需使用UNION ALL和AVG您的列。注意:我使用13作爲「平均」行的月份訂單,因此訂購時它會在最後。如果你需要其他東西,請告訴我。

CREATE PROCEDURE fiscalyear 
AS 
DECLARE @qstr   NVARCHAR(MAX), 
     @ColumnName  NVARCHAR(MAX), 
     @AvgColumnName NVARCHAR(MAX) 

SELECT @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(years), 
     @AvgColumnName = COALESCE(@AvgColumnName + ',','') + 'AVG(' + QUOTENAME(years) + ')' 
FROM tblact 
GROUP BY years; 

SET @qstr =' 
WITH CTE 
AS 
(
    SELECT months, ' + @ColumnName + ',total,average,monthorder FROM 
    (SELECT months, years, expenses,avg(expenses) over(partition by months) average,sum(expenses) over (partition by months) total ,monthorder FROM tblact) AS p 
    PIVOT(SUM(expenses) FOR years IN (' + @ColumnName + ')) AS PVTTable 
), 
CTE_Average 
AS 
(
SELECT months, ' + @ColumnName +',total,average,monthorder 
FROM CTE 
UNION ALL 
SELECT ''Average'',' + @AvgColumnName + ',AVG(total),AVG(average),13 
FROM CTE 
) 

SELECT months,' + @ColumnName + ',total,average 
FROM CTE_Average 
ORDER BY monthOrder' 

EXEC sp_executesql @qstr 
+0

Stephan:非常感謝你!在最後三天坐在它上面!代碼是絕對的! – Prhem

+0

Stephan先生,是否有我可以隱藏monthorder列在我的輸出? – Prhem

+1

您需要它來對數據進行排序,因此我只是添加了CTE_Average並從中選擇。一探究竟 – Stephan