質問: 以下のようなデータを、集計後のデータにしたい。 年月が連続していた場合(下のデータはでは二月ですが、三月の場合もあり)に合算させたいのですが、ここが上手い具合にグループ化できずに困ってます。 何かよい方法ありませんでしょうか。(アクセスのクエリでやっています) ⚫️集計前データ No. 年月 数 100 200012 100 100 200101 200 100 200004 400 200 200001 500 300 201001 600 ⚫️集計後データ No. 年月 数 100 200012 300 100 200004 400 200 200001 500 300 201001 600 or No. 数 100 300 100 400 200 500 300 600
回答: ps13zierさんがご指摘の通り、今回の集計には不向きなテーブル構造ですね。 これを無理矢理にでも集計するのであれば、Access利用とのことなので中間クエリをいくつか作成すれば実現は可能です。(さらにゴリ押しすれば中間クエリなしでもいけそうですが。) なお、以下のサンプルは最大連続3か月までの合算しか考慮していません。 また、集計元テーブル名はWK、カラム名はそれぞれNO, YM, SUとして作成しています。 **クエリ1** :集計テーブルのYYYYMM形式の年月から、前月・当月・翌月・翌々月を生成する。 ``` select WK.[NO] , WK.YM , WK.SU , CDATE(left ([ym], 4) & "/" & right ([ym], 2) & "/01") as YMD , DATEADD("m" , -1, CDATE(left ([ym], 4) & "/" & right ([ym], 2) & "/01") ) as PREV1 , DATEADD("m" , 1, CDATE(left ([ym], 4) & "/" & right ([ym], 2) & "/01") ) as NEXT1 , DATEADD("m" , 2, CDATE(left ([ym], 4) & "/" & right ([ym], 2) & "/01") ) as NEXT2 from WK; ``` **クエリ2** :クエリ1を元に、前月データの有無、翌月・翌々月の数量の取得する。 ``` select W1.[NO] , W1.YM , W1.SU , P1.[NO] as PREV1_FLG , N1.SU as NEXT1_SU , N2.SU as NEXT2_SU from ( ( ( WK_TEMP1 W1 left join WK_TEMP1 as P1 on W1.[NO] = P1.[NO] and W1.PREV1 = P1.YMD ) left join WK_TEMP1 as N1 on W1.[NO] = N1.[NO] and W1.NEXT1 = N1.YMD ) left join WK_TEMP1 as N2 on W1.[NO] = N2.[NO] and W1.NEXT2 = N2.YMD ); ``` **クエリ3** :クエリ2を元に、前月データがある場合は抽出対象外、それ以外は連続する月分の数量を合算する。 ``` select W2.[NO] , W2.YM , IIF( W2.PREV1_FLG is null , W2.SU + NZ(W2.NEXT1_SU, 0) + IIF(W2.NEXT1_SU is null, 0, NZ(W2.NEXT2_SU, 0)) , 0 ) as SU_TOTAL from WK_TEMP2 as W2 where W2.PREV1_FLG is null; ``` こんな感じでかなり無理矢理感がありますが、やればできなくはないです。 参考までに。