2017-05-22 3 views
0

매월 YTD 값을 계산하려고합니다. SQL Server에서 어떻게이 작업을 수행 할 수 있습니까?SQL에서 계산 된 가중 평균

enter image description here

그린 내 데이터가 테이블에 배치에 보이는 노란색의 일을 계산하는 가정하고 방법이다. 귀하의 도움을 많이 주시면 감사하겠습니다.

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

정말 고마워요! 나는 지금 2 시간 이후로 이것을 시도 해왔다. 고맙습니다. – 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