1

次の構造を含むテーブル [production] があります。

rep (char(10))    
,cyc_date (datetime) ---- already standardized to mm/01/yyyy
,amt (decimal)

2011 年 1 月 1 日から 2013 年 8 月 1 日までの各担当者のデータがあります。私ができるようにしたいのは、次のように、各担当者に対して 2012 年 1 月 1 日から始まる 12 か月の移動平均を作成することです。

rep    cyc_dt    12moAvg
-------------------------
A      1/1/2012    10000.01
A      2/1/2012    13510.05
.      ........    ........
A      8/1/2013    22101.32
B      1/1/2012    98328.22
B      ........    ........

ここで、各行は、指定された時点での担当者の 12 か月の移動平均を表します。漠然と似ている例をいくつか見つけて、それらを試してみましたが、役に立ちませんでした。group by rep コンポーネントの追加は、他の例との大きな違いのようです。

これは私が得た限りです:

SELECT
    rep,
    cyc_date,
    (
        SELECT Avg([amt])
        FROM production Q
        WHERE Q.[cyc_date] BETWEEN DateAdd("yyyy",-1,[cyc_date]+1) AND [cyc_date]
    ) AS 12moavg
FROM production

相関サブクエリにはグループ化がないため、そのクエリは全体の平均または合計を引き出しているようです。グループ化しようとすると、最大で 1 行しか返せないというエラーが表示されます。

4

1 に答える 1

2

相関サブクエリに 2 つの調整を加えるとうまくいくと思います。

  1. 式で 11 か月を引きDateAdd()ます。
  2. 別のWHERE条件を含めて、平均をrep親 (含む) クエリの現在の行と同じに制限します。
SELECT
    p.rep,
    p.cyc_date,
    (
        SELECT Avg(Q.amt)
        FROM production AS Q
        WHERE
                Q.rep = p.rep
            AND
                Q.cyc_date BETWEEN DateAdd("m", -11, p.cyc_date)
                    AND p.cyc_date
    ) AS [12moavg]
FROM production AS p;

相関サブクエリは遅くなる可能性があります。必ずインデックスを作成repcyc_date、これで痛みを制限してください.

于 2013-10-10T16:37:59.557 に答える