2017-06-26 29 views
0

私は次の12ヶ月の平均を計算しようとしています。SQL - 次の12ヶ月の平均

私たちが見てみたい月間に依存ファクターを計算しています

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

私が指定した1つのDate_Monthのために所望の答えを得ることができた、まだ私はトリミングできるようにしたいと思いますそれをダウン(NULLを含む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'); 

私は、理想的にはこれがそう文オーバーリード&を変更することを意味(ことにより、よりDate_Monthsを見て作るとまったく同じ出力を持っていますが、NULL &を含む行を削除したいです彼らはちょうど今のように最初のものを取っていない)。また、Sales_Down & Sales_Up列を最後に削除したいのですが、これは問題ではないようです。

私はMicrosoft SQL Server Management Studioを使用しており、SQL内の機能は悲しいです。

ありがとうございます。

答えて

0

私はあなたがこのような、OVER()句でLEAD()機能を使用することができます(特定されていない)が正しくあなたの質問を解釈する場合:

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節を必要とする、または使用できる非常に有用な「分析」関数があります。最初の行/最後の行/最古の行を返すのにOVER()は非常に便利です。

+0

ありがとう、私はwhere句でコードを組み込みましたそれは私が個々の会社のために欲しいものを生み出すようですが、その一般的な方法を知っていますので、その下の行の値を取るのではなく、複数のDate_YearsとDate_Monthに同じ出力を適用しますか? (出力には、Date_Year = 2014が多くありますので、コードが間違った行をSalesの入力として翌年に受け取るため、これは機能しません) –

+0

申し訳ありませんが、私たちはコメントを重ねました。 「一般化」するには、** PARTITION BY社を使用する必要があると思われます。**私が提供したドキュメントのリンクを参照してください。 LEAD/LAGを使用すると、定義した「パーティション」の新しい値ごとにLEAD/LAGが再開されます。それを試してみてください。 –

関連する問題