こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【Access】特定の顧客のみ集約して集計する

Access2010で下記のような条件で集計をしたいと思っています。
-------------------------------
テーブル1
フィールド(1):顧客番号
フィールド(2):売上金額
フィールド(3):売上月
001/100円/1月
002/ 50円/1月
003/200円/1月
004/150円/1月

テーブル2
フィールド:(1)顧客番号
フィールド(2)集約先(顧客番号)
001/002
002/003

★完成クエリ
フィールド(1)顧客番号(集約)
フィールド(2)売上金額
フィールド(3)売上月
003/350円/1月
004/150円/1月
-------------------------------

顧客番号ごとの売上金額を集計しますが、
その際、集約先を持つ顧客番号については、
集約先を参照し、顧客番号(集約)という括りで集計したいと思っています。

Excelだと、IF関数を使って「もし集約先セルが空欄なら顧客番号を参照してコピーする」等して、
顧客番号(集約)の列で括って集計する、と考えたりできるのですが、
Accessは不慣れなこともあって、なかなか良い方法が思いつきません・・・。

どうか集計方法をご教授いただけないでしょうか。
よろしくお願いします。

投稿日時 - 2013-05-13 22:07:59

QNo.8086569

困ってます

質問者が選んだベストアンサー

テーブル1として
テーブル名「T9」
フィールド:顧客番号(テキスト)/ 売上金額(通貨) / 売上月(テキスト)

テーブル2として
テーブル名「T9A」
フィールド:顧客番号(テキスト)/ 集約先番号(テキスト)

と仮定します。
標準モジュールに以下を記述しておきます。

Public Function Bango(sSrc As String) As String
  Dim rs As New ADODB.Recordset
  Dim sR As String

  sR = sSrc
  rs.Source = "SELECT * FROM T9A WHERE 顧客番号='" & sSrc & "';"
  rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
  If (Not rs.EOF) Then sR = Bango(rs("集約先番号"))
  rs.Close
  Bango = sR
End Function

クエリの SQL ビューで以下を記述します。

SELECT Bango(顧客番号) AS 集約番号, Sum(売上金額) AS 売上金額計, 売上月
FROM T9
GROUP BY Bango(顧客番号), 売上月;


※ 処理性能はわかりません
※ 不都合あれば修正してください

投稿日時 - 2013-05-14 08:18:26

お礼

ご回答ありがとうございます!

早速試してみたところ、期待通りの結果が出ました!

この機会にVBAをきちんと勉強したいと思います。
どうもありがとうございました。

投稿日時 - 2013-05-14 19:53:03

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

集約先には複数の顧客番号が含まれるということですね
テーブル1に集約先も入れておいて集約させない場合は顧客場号と同じ物を記載
集計時に集約先で集計ではだめかな
顧客番号を二回記入するのが面倒なら
顧客ナンバーと集約ナンバーのテーブルつくって顧客ナンバー記入したら自動的に集約ナンバーはいるようにすればいい
複雑にしない方が逆に楽ですよ

投稿日時 - 2013-05-13 22:43:54

お礼

ご回答ありがとうございます!

同じテーブル内で集約先も追加してしまうんですね。
自動入力のアドバイスも大変参考になります。
ありがとうございます。

ただ、書き漏らしがあって申し訳ないのですが、
「集約先(顧客番号)」は入れ子のようになっている場合があります(集約先の集約先がある)

テーブル2のように、
>001/002
>002/003
と、002と003が別の集計ではなく、
003(002+001)の集計結果が欲しいです。

なので、集約先が空白になるまで参照するマクロが必要かな?とも思っていました。
今回ご回答いただいたような、スマートな方法があればよいのですが・・・。

投稿日時 - 2013-05-14 00:12:45

あなたにオススメの質問