我可以计算{(过去时间的非NULL值)和非空的数量}?

时间:2016-07-02 23:52:58

标签: sql-server sql-server-2014

我有以下表格,

ID | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 
----------------------------------------------
1  |  0   |   0  |  90  |  90  |  100 |  100 |
2  | NULL | 130  | 100  |  70  |   0  |   0  |

我需要将历史记录的平均值计算到新表中。

例如,对于2009年的ID#1,我想计算0/1 = 0并在新表中插入[2009],在2010年,我想计算(0 + 0)/ 2 = 0并在新表中插入[2010]。对于2011年,我想计算(0 + 0 + 90)/ 3 = 30并在新表中插入[2011],依此类推。

对于ID#2,由于[2009]中的值为' NULL',我必须忽略该值。因此,我想保持' NULL'在新表中的[2009]中,并在新表中的[2010]中计算(130)/ 1 = 130。对于2011年,我想计算(130 + 100)/ 2 = 115并在新表中插入[2011]。有没有办法可以(在过去的时间内总结非NULL值)/非空的#?

谢谢!

1 个答案:

答案 0 :(得分:0)

这样的事情应该有所帮助

CREATE temporary TABLE IF NOT EXISTS mean_temp AS 
  (SELECT * 
   FROM   (SELECT id, 2009 AS years, [2009] AS valu 
           FROM   yourtable 
           UNION ALL 
           SELECT id, 2010, [2010] 
           FROM   yourtable 
           UNION ALL 
           SELECT id, 2011, [2011] 
           FROM   yourtable 
           UNION ALL 
           SELECT id, 2012, [2012] 
           FROM   yourtable 
           UNION ALL 
           SELECT id, 2013, [2013] 
           FROM   yourtable 
           UNION ALL 
           SELECT id, 2014, [2014] 
           FROM   yourtable)A) 

SELECT id,years, 
       (SELECT Sum(valu) 
        FROM   mean_temp b 
        WHERE  a.id = b.id 
               AND a.years >= b.years) / (SELECT Count(valu) 
                                          FROM   mean_temp c 
                                          WHERE  a.id = c.id 
                                                 AND a.years >= c.years) 
FROM   mean_temp a 
ORDER  BY id, 
          years 

Count汇总不会计算NULL值,因此仅对除法not null值进行计算