2012-04-24 116 views
2

我想計算一年的平均值,情況如下。如何計算嵌套查詢中每年的平均值?

Plant_ID | Year | Month | MR | Range 
    CCAR | 2009 | 1  | 0,706 | Null 
    CCAR | 2009 | 2  | 0,626 | 0,08 
    CCAR | 2009 | 3  | 0,637 | 0,11 
    CCAR | 2009 | 4  | 0,737 | 0,1 
    CCAR | 2009 | 5  | 0,552 | 0,19 
    CCAR | 2009 | 6  | 0,418 | 0,137 
    CCAR | 2009 | 7  | 0,503 | 0,085 
    CCAR | 2009 | 8  | 0,645 | 0,058 
    CCAR | 2009 | 9  | 0,743 | 0,098 
    CCAR | 2009 | 10  | 0,556 | 0,187 
    CCAR | 2009 | 11  | 0,298 | 0,258 
    CCAR | 2009 | 12  | 0,339 | 0,041 
    CCAR | 2010 | 1  | 0,381 | 0,042 
    Etc. 

我想添加兩列; 1(aMR)計算每年的平均MR(維護率),因此2009年的平均值爲1,2010年爲1等,第二個計算每年的平均範圍。我的問題是我不知道在我的查詢中該怎麼做,因爲它稍微複雜一些,我可以處理....我已經發表了一個聲明來添加一個列表aMR,這是MR的平均值(請參閱下面的查詢代碼)。但是我每年都得不到一個平均值(現在它返回所有MR值的總平均值)任何人都可以幫助我嗎?

WITH cte AS (
SELECT Plant_Id, 
     Jaar, 
     Maand, 
     (SUM(Compl) + 0.000)/SUM(Total) AS MR, 
     ROW_NUMBER() OVER (ORDER BY Jaar DESC, 
     Maand DESC) AS RowNumber 
FROM (SELECT Plant_Id, 
      Jaar, 
      Late, 
      EarlyJobs, 
      OnTimeJobs, 
      Maand, SUM(EarlyJobs +OnTimeJobs) AS Compl, 
      SUM(EarlyJobs) + SUM(Late) + SUM(OnTimeJobs) AS Total 
     FROM MaintenanceRatebepaen AS MaintenanceRatebepaen_1 
     GROUP BY Plant_Id, Jaar, Maand, Late, OnTimeJobs, EarlyJobs) AS MaintenanceRatebepaen 
WHERE (Jaar >= 2009) AND (Jaar <= 2011) AND (Plant_Id = 'CCAR') 
GROUP BY Jaar, Plant_Id, Maand) 

SELECT d1.Plant_Id, 
     d1.Jaar, 
     d1.Maand, 
     d1.MR, 
     abs(d1.MR - d2.MR) AS [ChangeMRFromPreviousMonth], 
     aMR =(SELECT avg(cte.MR) FROM cte) 
FROM cte d1 
LEFT OUTER JOIN cte d2 ON d2.RowNumber = (d1.RowNumber + 1) 
ORDER BY d1.Rownumber DESC 

所以我想添加兩列;每年計算MR(aMR)的平均值,第二個計算每年的平均範圍。任何人都可以幫助我嗎?我很新的SQL和任何幫助將不勝感激!

回答

0

嘗試

aMR = avg (d1.MR) over (partition by d1.Plant_Id, d1.Jaar, d1.Maand) 

我不確定d1.Maand更換aMR =(SELECT avg(cte.MR) FROM cte)。如果這意味着月份,請將其從分區中刪除。至於範圍(?或更改),您也可以嘗試:

aChange = avg (d1.MR - d2.MR) over (partition by d1.Plant_Id, d1.Jaar, d1.Maand) 
+0

輝煌!它的作品,非常感謝你!我一直在嘗試這幾天。 – Benne 2012-04-24 09:50:21

0
SELECT 
    PLant_id 
    ,year 
    ,avg(mr) as avgMR 
    ,avg(range) as avgRange 
FROM 
    table 
GROUP BY 
    Plant_id,year 

,那麼你可以加入到這個計算方差或類似

SELECT 
    t.* 
    ,c.* 
    ,t.mr - c.avgMR as MRvariance 
    ,t.Range - c.avgRange as RangeVariance 
FROM 
    table as t 
     INNER JOIN (
      SELECT 
       PLant_id 
       ,year 
       ,avg(mr) as avgMR 
       ,avg(range) as avgRange 
      FROM 
       table 
      GROUP BY 
       Plant_id,year 
    ) as c 
      ON c.plant_id = t.plant_id 
      AND c.year = t.year 
2

如果你能得到像表myTable (Plant_ID, Year, Month, MR, Range),你已經完成了大部分的工作:

SELECT year, AVG(MR) AS "avg_mr", AVG(range) AS "avr_range" 
FROM myTable 
GROUP BY year; 

如果這個數據是從一個複雜的查詢結果只需更換這該查詢的假設表名稱:

SELECT year, AVG(MR) AS "avg_mr", AVG(range) AS "avr_range" 
FROM (
    SELECT ... FROM ... -- complex query goes here 
) 
GROUP BY year;