SQL - 下一个十二个月的平均值

时间:2017-06-26 17:22:06

标签: sql sql-server function tsql datepart

我正在尝试计算下一个十二个月的平均值。

我计算了一个因子,它取决于我们想要查看的月份:

365-DATEPART(dy,'2017-06-26')/365  & 1-365-DATEPART(dy,'2017-06-26')/365 

我已经能够为一个指定的Date_Month获得所需的答案,但我希望能够将其修剪掉(删除包含NULL的空值)&使其可以应用于多个Date_Months。

这是当前的输出:

Company_Id  Sales   Date_Year   Date_Month  NTMA_Factor Sales_Down  Sales_Up    NTMA_Sales
        1   675.051     2014    2013-03-31  0.7534      675.051     NULL        NULL
        2   47946.200   2014    2013-03-31  0.7534      47946.200   50364.200   48542.4788000
        2   50364.200   2015    2013-03-31  0.7534      50364.200   NULL        NULL
        3   6891.430    2014    2013-03-31  0.7534      6891.430    6917.450    6897.8465320
        3   6917.450    2015    2013-03-31  0.7534      6917.450    NULL        NULL
        5   2190.140    2014    2013-03-31  0.7534      2190.140    2318.250    2221.7319260
        5   2318.250    2015    2013-03-31  0.7534      2318.250    NULL        NULL

对于更大的Date_Months,有没有办法在SQL中执行此操作?

到目前为止的查询:

SELECT top 7
    S.Company_Id
    , S.Sales
    , Y.Date_Year
    , M.Date_Month
    , N.NTMA_Factor
    , (S.Sales) AS Sales_Down
    , (LEAD(S.Sales, 1) OVER (Partition by S.Company_Id ORDER BY Y.Date_Year ASC)) AS Sales_Up
    , ((S.Sales * N.NTMA_Factor)  + (LEAD(S.Sales, 1) OVER (Partition by S.Company_Id ORDER BY Y.Date_Year ASC))*(1-NTMA_Factor)) As NTMA_Sales 
FROM Sales AS S
      INNER JOIN Date_Year AS Y ON Y.Date_Year_Id = S.Date_Year_Id
      INNER JOIN Date_Month AS M ON M.Date_Month_Id = S.Date_Month_Id
      INNER JOIN NTMA_Factor AS N ON N.Date_Month_Id = M.Date_Month_Id
where
    Date_Year in (2014,2015, 2013) and Date_Month in ('2013-03-31');

我理想情况下想要具有完全相同的输出但是删除包含NULL和&的行。可以查看更多的Date_Months(这意味着更改Lead& Over语句,这样他们就不会像现在这样做下面的第一个)。我还想删除Sales_Down&最后的Sales_Up列,但这似乎不是问题。

我正在使用Microsoft SQL Server Management Studio,并且不熟悉SQL中的函数。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果我正确地解释了您的问题(这不是确定的话),您可以将LEAD()函数与OVER()子句一起使用,例如:

SELECT
      S.Sales
    , Y.Date_Year
    , M.Date_Month
    , N.NTMA_Factor
    , (S.Sales * N.NTMA_Factor) AS NTMA_Sales_Down
    , LEAD(S.Sales, 1) OVER (ORDER BY Y.Date_Year ASC) AS SalesNextYear
FROM Sales AS S
      INNER JOIN Date_Year AS Y ON Y.Date_Year_Id = S.Date_Year_Id
      INNER JOIN Date_Month AS M ON M.Date_Month_Id = S.Date_Month_Id
      INNER JOIN NTMA_Factor AS N ON N.Date_Month_Id = M.Date_Month_Id
;

LEAD和LAG功能让您可以期待" (领导)或"向后看" (滞后)跨行,我认为这是你正在寻找的功能。 OVER条款提供"控制"关于功能如何运作。在这种情况下,需要按年份编号。

nb:有一系列非常有用的"解析"也需要或可以使用over子句的函数。例如,SUM()OVER()可以提供运行总计,或者ROW_NUMBER()OVER()对于返回第一个/最后一个/最早/最晚的行非常有用