クエリで累計を求める

 Excelの場合は「1つ上のセルの値を参照する」といった計算が可能なので累計の算出は容易です。しかしAccessではそのような計算ができないためなかなか面倒になります。不便を感じる部分かとは思いますが、やり方を覚えれば順位の算出なども似たような感じでできますので慣れていただきたいと思います。
 なお本記事では便宜上クエリで求めていますが、フォームでも同様の式を利用して求めることは可能です。また、レポートの場合はコントロールの「集計実行」プロパティで容易に実現できますので参考まで。

基本的な例(グループの区別がない)

f:id:accs2014:20190125164958p:plain:right:w250

 単純に累計を求める例です。
 サンプルは画像のようなテーブルとし、日付ごとに(その日までの)売上額の累計を求めます。
 なお「日付」列は日付型、「売上高」列は数値型です。

DSum関数で求める場合

f:id:accs2014:20190125164956p:plain:right:w600

 DSum関数で求めるケースです。
 クエリのデザインビューで次のような列を設けます。

売上額累計: CLng(DSum("売上額","T_売上","日付 <= #" & [日付] & "#"))

 DSum関数の第3引数、つまり抽出条件を表す「"日付 <= #" & [日付] & "#"」が初心者泣かせの部分です。以下のポイントに注意してください。

  • 単に「"日付 <= #[日付]#"」などとしてしまうと「[日付]」の部分が日付列の値に置き換えられないため、失敗します。
  • 「日付」列は日付型ですので、値の前後に「#」を加える必要があります。
    もし日付列がテキスト型であれば「#」の代わりに「'」を用いて「"日付 <= '" & [日付] & "'"」とします。
    数値型の場合はこのような記号は必要なく、「"日付 <= " & [日付]」とします。
  • 累計額は「そのレコードより上に表示されている売上額の合計」はなく「その行の『日付』以前の売上額の合計」として求めています。「日付」列の並べ替え欄を「降順」にしても、表示の順番が変わるだけで各日付の累計額は変わりません。
  • 「<=」のところを「<」としてしまうと、当日の売上額が累計に算入されません。
 なお、DSum関数の戻り値はテキスト型になりますので、ここではCLng関数で整数型に変換しています。

f:id:accs2014:20190125164953p:plain:right:w350

 データシートビューです。

サブクエリで求める場合

 サブクエリ(相関サブクエリ)とSum関数で求めるケースです。応用編といった感じでちょっと難しいですし、ここでは考え方にまで触れませんので慣れないうちはDSum関数による方法をおすすめします。
 ただし単に難しいというものではなくメリットもあり、WHERE部分がDSum関数の例に比べてだいぶスッキリします。

f:id:accs2014:20190125164950p:plain:right:w600

 クエリのデザインビューで次のような列を設けます。

売上額累計: (SELECT Sum([売上額]) FROM T_売上 AS T_売上_1 WHERE T_売上_1.日付 <= T_売上.日付)

f:id:accs2014:20190125164947p:plain:right:w350

 データシートビューです。

グループごとに累計を求める例

f:id:accs2014:20190126164707p:plain:right:w450

 こちらの例ではグループごとに、つまり店舗コードごとに累計を求めます。
 数値を抽出する条件が1つ増えるだけですので難しくありません。
 なお「店舗コード」は数値型、「日付」列は日付型、「売上高」列は数値型です。

DSum関数で求める場合

f:id:accs2014:20190125165037p:plain:right:w600

 次のような列を設けます。

店舗別売上額累計: CLng(DSum("売上額","T_店舗別売上","店舗コード = " & [店舗コード] & " AND 日付 <= #" & [日付] & "#"))

 注意点は最初の例と同様です。「"」の内と外の区別を注意深く確認してください。

f:id:accs2014:20190125165035p:plain:right:w500

 データシートビューです。

サブクエリで求める場合

f:id:accs2014:20190125165032p:plain:right:w600

 次のような列を設けます。

店舗別売上額累計: (SELECT Sum([売上額]) FROM T_店舗別売上 AS T_店舗別売上_1 WHERE T_店舗別売上_1.店舗コード = T_店舗別売上.店舗コード AND T_店舗別売上_1.日付 <= T_店舗別売上.日付)

 DSum関数の場合は条件が増えると記号が増えすぎて訳が分からなくなりますが、サブクエリでは式が加わるだけですので、サブクエリのメリットが目立ちます。

f:id:accs2014:20190125165029p:plain:right:w500

 データシートビューです。