2012-04-24 115 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;