累計値を求める

  データベースによっては、特定のフィールドの累計地が必要な場
合があります。しかし、Accessでは簡単に累計を求めるような関数
は用意されていません。そこで、今回はDSum関数とサブクエリを使
用して累計値を求める方法を説明します。


● 準備 ●

(1) 以下の構成の[売上]テーブルを作成します。
    ----------------------------------------
    フィールド名        データ型
    売上ID              オートナンバー
    品名                テキスト型
    売上日              日付/時刻型
    売上金額            通貨型
    ----------------------------------------
(2) 売上テーブルに適当なデータを入力します。

      

(3) 売上テーブルをソースとした新規クエリを作成し、全フィール
    ドを選択します。


● サンプル ●

(1) DSum関数を使用する場合
  クエリの空白のフィールド欄に以下の式を記述します
--------------------------------------------------------------------
累計1: DSum("売上金額","売上テーブル","売上日 <= #" & [売上日] & "#")
--------------------------------------------------------------------

(2) サブクエリを使用する場合
  クエリの空白のフィールド欄に以下の式を記述します
--------------------------------------------------------------------
累計2: (Select Sum(売上金額) From 売上テーブル As temp売上
       Where 売上テーブル.売上日 >= temp売上.売上日
       And 売上テーブル.品名 = temp売上.品名)
--------------------------------------------------------------------

(3) [q売上累計]という名前を付けてクエリを保存します。
    このクエリ全体では以下のようなSQL文となります。
--------------------------------------------------------------------
SELECT *,
DSum("売上金額","売上テーブル","売上日 <= #" & [売上日] & "#") AS 累計1,
(Select Sum(売上金額) From 売上テーブル As temp売上
Where 売上テーブル.売上日 >= temp売上.売上日
And 売上テーブル.品名 = temp売上.品名)) AS 累計2
FROM 売上テーブル;
--------------------------------------------------------------------


● 動作確認 ●

  クエリをデータシートビューで開きます。
  累計1では日付による累計計算がされており、累計2では日付と品名による累
計計算がされていることを確認して下さい。

    


● 詳細 ●

  DSum関数は定義域集計関数と呼ばれるもので、以下の構文によりなります。
  Dsum(式, 定義域, [範囲])
  サンプルでは売上テーブル(=定義域)の売上金額(=式)を、売上日によって選
択し(=範囲)集計しています。範囲はSQL文のWhere句と同じように文字列式で記
述する必要があり、今回は比較対照がクエリのカレントフィールドですので、
フィールドを変数のように指定しています。

  後者はサブクエリを使用する方法です。売上テーブルに「temp売上」という
エイリアス(別名)を付け、売上テーブルのカレントレコードと、売上テーブル
全体の売上金額フィールドを比較しています。
  またサンプルでは品名も比較していますので、品名が同じであり売上日がカ
レントレコード以下のものが集計されます。

  ここで注意が必要な点は、必ず各フィールドを識別・比較するためのフィー
ルドが必要であるということです。AccessのテーブルはExcelの表と違い、行
(レコード)の上下位置を保存していません。インデックスによって並び替えを
行っているため、一見レコードの並び順が保存されているように見えますが、
それは単にテーブルを開く時に並び替えを行っているだけで、レコード毎の位
置関係を保存している訳ではないのです。

  ですから今回のような集計を行う場合、IDなど各レコードを一意に識別する
ことが出来るフィールドや、日付のように各レコードの位置関係を明確にでき
るフィールドが必要になります。


■■ 用語説明 ■■

○ 定義域集計関数
   特定のレコードセット(定義域。通常はテーブルやクエリ)に含まれるフィー
   ルドの値を計算する関数。
   SQLの集計関数と用途は似ているが、こちらはSQL文以外でも使用できる。
   計算速度が非常に遅いのがネックである。

○ サブクエリ
   クエリの中に埋め込んだ、もう一つの選択クエリ(Select文)のこと。
   これを使用すると再帰的な集計や、レコード毎の比較などが可能になる。

Access97/2000



戻る


Excel Word Access VBA! モーグ