2017-05-22 31 views
0

私は毎月のYTD値を計算しようとしています。 SQL Serverでこれをどのように達成できますか?SQLで計算された加重平均

enter image description here

グリーンは私のデータがtable.Iでどのように見えるかである黄色に1を計算することとしています。あなたの助けに感謝します。

Year Month Monthly_Score N_size YTD_Score 
2017 1  70    10  70*10/10 
2017 2  80    20  70*10/(10+20) + 80 *20 /(10+20) 
2017 3  90    30  70*10/(10+20+30) + 80 * 20 /(10+20+30) 
             +90*30/(10+20+30) 
+0

あなたが使用しているSQL Serverのバージョン? –

答えて

1

ご使用のSQL Serverのバージョンがサポートしている場合は、ウィンドウ機能SUMを使用できます。

select year,month,monthly_score,n_size, 
1.0*sum(monthly_score*n_size) over(partition by year order by month)/ 
sum(n_size) over(partition by year order by month) 
from yourtable 

値は毎年リセットされることに注意してください。

編集:outer applyをサポートする2012より下のSQL Serverの場合。

select y.year,y.month,y.monthly_score,y.n_size,t.ytd_score 
from yourtable y 
outer apply (select 1.0*sum(monthly_score*n_size)/sum(n_size) as ytd_score 
      from yourtable y1 
      where y.year=y1.year and y1.month<=y.month 
      ) t 
+0

それは素晴らしいです!私はそれがうまくいくと思う。私はちょうど試みた。私は他人をテストし、あなたに知らせるつもりです。 – Swethak

+0

ありがとう!私は今数時間からこれを試しています。感謝します。 – Swethak

+0

SQL Server 2008でこれを行う必要がある場合は、これをどのように行うことができますか?助けてください! – Swethak

1

あなたが実行中の合計を計算するために合計するsumの窓バリアントを使用することができます。

SELECT [Year], [Month], [Monthly_Score], [N_Size], 
     SUM([Monthly_Score] * [N_Size]) 
      OVER (ORDER BY [Year], [Month] 
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)/
     SUM([N_Size]) 
      OVER (ORDER BY [Year], [Month] 
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS YTD_Score 
FROM my_table 
+0

ありがとうございました。私はちょうど似たような試みをしましたが、UNBOUNDED PRECEDINGとCURRENT ROWはなく、うまくいきました。これがどのような違いがあるのか​​不思議です。 – Swethak

+0

これをSQL Server 2008で実行する必要がある場合は、これをどのように達成できますか? – Swethak