データベースによっては、特定のフィールドの累計地が必要な場
合があります。しかし、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文)のこと。
これを使用すると再帰的な集計や、レコード毎の比較などが可能になる。
|