2016-08-02 271 views
0

该表如下。如何获得平均值YTD

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
25 20 45 10 15 23 23 17 19 21 24 33 

我想显示到上个月的平均值。意思是,如果这是八月,我想展示到七月。如果当前月份是9月份,我想要到7月份。该表格应如下所示。

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Avg 
25 20 45 10 15 23 23 17 19 21 24 33 23 
+0

你只有表现出我们一月的数据通过十二月在上表中。如果我想在八月到七月之间展示什么?你的表是派生表吗? –

+0

更改你的餐桌设计......该布局是非标准化餐桌的红旗#1。为年/月添加一列,为该值添加另一列。 – jleach

回答

2

您的数据格式是非常差的。您可以更好地使用列中的数据。但是,你可以做一个痛苦的查询是这样的:

select ((case when month(getdate()) > 1 then jan else 0 end) + 
     (case when month(getdate()) > 2 then feb else 0 end) + 
     . . . 
     (case when month(getdate()) > 11 then nov else 0 end) 
     )/
     ((case when month(getdate()) > 1 then 1 else 0 end) + 
     (case when month(getdate()) > 2 then 1 else 0 end) + 
     . . . 
     (case when month(getdate()) > 11 then 1 else 0 end) 
     ) 
+0

感谢您的回复。请帮助我以下。我已经在sql中编写了数据透视表的代码。在这里,我必须添加一个YTD列,它应该显示上个月的数据总和。 – Manish

+1

将您的代码发布为其他问题。 –

1

你想这样的事情?:

SELECT * INTO tbl_Month_AVG 
FROM (VALUES 
(25,1),(20,2),(45,3),(10,4),(15,5),(23,6),(23,7),(17,8),(19,9),(21,10),(24,11),(33,12)) as a(Num,Mon) 

;WITH Avg_On as (
SELECT Mon, SUM(Num) OVER(ORDER BY Mon) 
    /COUNT(*) OVER(ORDER BY (SELECT NULL)) as Avg_On 
FROM tbl_Month_AVG 
WHERE Mon < 8 
) 
SELECT Avg_On FROM Avg_On 
WHERE Mon = (Select MAX(Mon) FROM Avg_On) 
+0

感谢您的回复。请帮助我以下。我已经在sql中编写了数据透视表的代码。在这里,我必须添加一个YTD列,它应该显示上个月的数据总和。 – Manish