0

コード :

SELECT YEAR_ID, Count, ThreeYEARAverage, 
       AVG(Count) OVER (ORDER BY YEAR_ID ROWS 4 PRECEDING) AS FiveYEARAverage 
FROM (SELECT YEAR_ID, ISNULL(Count, 0) AS Count, 
             AVG(ISNULL(Count, 0)) OVER (ORDER BY YEAR_ID ROWS 2 PRECEDING) AS ThreeYEARAverage 
      FROM (SELECT DATEPART(YEAR, Date_plan) AS YEAR_ID, 
            SUM(ISNULL(Amount_produced, 0)) AS Count 
            FROM History_mango   
            WHERE DATEPART(YEAR, Date_plan) BETWEEN '2012' AND '2016' 
                  AND DATEPART(month, Date_plan) =  '09' 
            GROUP BY DATEPART(YEAR, Date_plan)) AS id
      ) AS id1

結果

YEAR_ID Count ThreeYEARAverage  FiveYEARAverage 
2012    22    22.000000         22.000000
2013    555   288.500000        288.500000
2014    100   225.666666        225.666666
2015    88    247.666666        191.250000
2016    200   129.333333        193.000000

必要

YEAR_ID Count ThreeYEARAverage  FiveYEARAverage 
2012    22  
2013    555 
2014    100   225.666666    
2015    88    247.666666
2016    200   129.333333        193.000000

ありがとうございます

4

1 に答える 1

0

これをテストするための SQL Server 2012 を手元に持っていませんが、次のように動作するはずです。

SELECT YEAR_ID, Count,
       (case when count(*) over (rows 2 preceding) >= 3
             then AVG(ISNULL(Count, 0)) OVER (ORDER BY YEAR_ID ROWS 2 PRECEDING) 
        end) AS ThreeYEARAverage,
       (case when count(*) over (rows 4 preceding)
             then AVG(Count) OVER (ORDER BY YEAR_ID ROWS 4 PRECEDING
        end) AS FiveYEARAverage
FROM (SELECT DATEPART(YEAR, Date_plan) AS YEAR_ID,
             SUM(coalesce(Amount_produced, 0)) AS Count
      FROM History_mango
      WHERE DATEPART(YEAR, Date_plan) BETWEEN '2012' AND '2016' AND DATEPART(month, Date_plan) = '09'
      GROUP BY DATEPART(YEAR, Date_plan)
     ) id

各グループの数をカウントします。十分な数がある場合は、平均が表示されます。

ところで、count変数の名前などの予約語を使用することは一般的に悪い考えです。また、coalesce標準SQLisnullはそうではありません。そして、これは、各年のデータがあることを前提としています。

于 2013-03-19T15:53:03.343 に答える