使用 T-sql 和 Pivot 按列平均
Average Column-wise by using T-sql and Pivot
我开发了财政年度数据 财政年度明智到现在我已经做到了!但我无法获得列平均
我的table定义
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
请帮助获得答案
我现在的输出:
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
请帮忙!
我稍微清理了你的代码。我只是使用 UNION ALL 和 AVG 你的专栏。注意:我使用 13 作为 'Average' 行的月份顺序,所以当它被订购时,它排在最后。如果您还需要什么,请告诉我。
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
我开发了财政年度数据 财政年度明智到现在我已经做到了!但我无法获得列平均
我的table定义
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
请帮助获得答案
我现在的输出:
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
请帮忙!
我稍微清理了你的代码。我只是使用 UNION ALL 和 AVG 你的专栏。注意:我使用 13 作为 'Average' 行的月份顺序,所以当它被订购时,它排在最后。如果您还需要什么,请告诉我。
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