Accessデータベースのクエリによる集計方法のアドバイスをお願いします

このQ&Aのポイント
  • Accessデータベースにおいて、特定の条件によって値を加算・減算し集計する方法についてアドバイスをお願いします。
  • テーブル内の区分1と区分2の金額を減算し、除外金額columnと売上columnを求めたいです。
  • クエリまたはSQLを使用して、理想的な集計結果を得る方法や妥協案についてアドバイスをお願いします。
回答を見る
  • ベストアンサー

Access 条件によって、加算・減算

フィールドの値によって加算・減算し集計したいのですが、アドバイスを頂けると幸いです。 ◎環境 Access2010 ◎テーブル ID(AI)|受付CD(テキスト)|科目CD(テキスト)|区分(数値)|金額(数値) 1    |2015062222    |0001       |1      |100000 2    |2015062222    |0005       |2      |30000 3    |2015063333    |0001       |1      |120000 4    |2015063333    |0007       |2      |70000 上記テーブルのデータで、区分1から区分2の金額を減算出来ればと考えております。 その場合、どういったクエリを作成すればよいかわかりません。 ◎理想の集計結果 受付CD(テキスト)|金額(数値)|除外金額(数値)|売上(数値) 2015062222    |100000   |30000      |70000 2015063333    |120000   |70000      |50000 区分2の項目を別の列にできれば、一番理想です。 ▲妥協案として ID(AI)|受付CD(テキスト)|科目CD(テキスト)|区分(数値)|金額(数値) 1    |2015062222    |0001       |1      |100000 2    |2015062222    |0005       |2      |-30000 3    |2015063333    |0001       |1      |120000 4    |2015063333    |0007       |2      |-70000 区分2の金額をマイナスにする。 選択クエリ・SQLどちらでも、実装できれば結構です。 アドバイス頂けましたら幸いです。

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

  • ベストアンサー
回答No.2

SELET AAA, SUM(BBB) AS CCC FROM DDD GROUP BY AAA 構文のアレンジで・・・。 SELECT   受付CD,   Sum(IIf([区分1]=1,金額,0)) AS 合計1,   Sum(IIf([区分1]=2,.金額,0)) AS 合計2,   [合計1]-[合計2] AS 売上 FROM AAAA GROUP BY 受付CD ORDER BY 受付CD;

sujino
質問者

お礼

f_a_007様 アドバイスありがとうございます。 まだ、テストしていませんが、まさしく私がほしかった理想の形です。 IFF文で、区分を分別して、ASでカラムを分ける。 多分、この形は今後頻繁につかうと思いますので、勉強になりました。 ありがとうございます。

その他の回答 (4)

  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.5

続き。 ここまで出来れば「最大、最小を用いる」ことで「理想通りのクエリ」が作れます。 そうして作ったクエリが SELECT TABLE1.受付CD, Max(IIf([区分]<>2,[TABLE1].[金額],0)) AS 金額, Max(IIf([区分]<>2,0,[TABLE1].[金額])) AS 除外金額, Sum(IIf([区分]<>2,[TABLE1].[金額],-[TABLE1].[金額])) AS 売上 FROM TABLE1 GROUP BY TABLE1.受付CD; です。 結果は 受付CD(テキスト)|金額(数値)|除外金額(数値)|売上(数値) 2015062222    |100000   |30000      |70000 2015063333    |120000   |70000      |50000 となります。

sujino
質問者

お礼

chie65535様 重ね重ね、アドバイス頂きありがとうございます。 今回のBAは、一番早く私が理想の形の書き方をお教え頂いた、#2のf_a_007様とさせて頂きます。 また、機会がありましたら、アドバイスお願いいたします。

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.4

No.3 です。 訂正です。 SELECT テーブル.受付CD, Sum(IIf([区分]=1,[テーブル].[金額],0)) AS 金額, Sum(IIf([区分]=1,0,[テーブル].[金額])) AS 除外金額, Sum(IIf([区分]=1,[テーブル].[金額],[テーブル].[金額]*(-1))) AS 売上 FROM テーブル GROUP BY テーブル.受付CD;

sujino
質問者

お礼

m3_maki様 アドバイス頂きありがとうございます。 書き方の注意事項も教えて頂き、勉強になりました。 ご親切にお教え頂き、大変申し訳ありませんが、今回のBAは一番早く適格に回答頂いた、#2のf_a_007様とさせて頂きます。 また、機会がありましたら、アドバイスお願いいたしまうす。

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.3

◎理想の集計結果 の方で(笑 SELECT テーブル.受付CD, Sum(IIf([区分]=1,[テーブル].[金額],0)) AS 金額, Sum(IIf([区分]=1,0,[テーブル].[金額])) AS 除外金額, Sum(テーブル.金額) AS 売上 FROM テーブル GROUP BY テーブル.受付CD; 元のテーブルのフィールド名「金額」と 集計されたフィールド「金額」を区別する必要があるため [テーブル].[金額] のように、テーブル名が省略されない形で記述する必要があります。

  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.1

>▲妥協案として >区分2の金額をマイナスにする。 惜しい所まで行っています。 「区分2の金額をマイナスにする」のは「クエリで可能」です。 「区分2の金額をマイナスにする」のがクエリで出来れば、あとは「受付CD単位で集計するだけ」です。 集計にID、科目CD、区分は使えないので、これら3つは、とりあえず「最小値」を表示する事にします。 そのようにして作ったクエリが、以下のクエリです(元テーブルのテーブル名は「TABLE1」とします) SELECT Min(TABLE1.ID) AS ID, TABLE1.受付CD, Min(TABLE1.科目CD) AS 科目CD, Min(TABLE1.区分) AS 区分, Sum(IIf([TABLE1].[区分]=2,-[TABLE1].[金額],[TABLE1].[金額])) AS 金額 FROM TABLE1 GROUP BY TABLE1.受付CD; 結果は以下のようになります。 ID(AI)|受付CD(テキスト)|科目CD(テキスト)|区分(数値)|金額(数値) 1    |2015062222    |0001       |1      |70000 3    |2015063333    |0001       |1      |50000

sujino
質問者

お礼

chie65535様 アドバイスありがとうございます。 すいません、私の例が紛らわしいからだと思うのですが、minを使うと言う事はの科目CD、区分の最少行しか集計出来ないのではと思います。 実際のレコードには、科目CDが複数あり、特定の科目CDの区分は一意です。 具体的には、売上には、室料とその追加オプションメニューが含まれておりまして、純粋な室料を算出したいと考えております。 が、区分1は全体の金額、科目2はオプションの金額、区分1の中でもコース・時間帯によって金額が変わります。 その為、区分1の科目○○(全体のコース料金)から、コースの中で使用する材料や機器の使用料(区分2)を減算し、純粋な室料を集計したかったのです。 その為、1つの受付CDにはコース(区分1)や、付帯料金(区分2)が複数あります。 そのため、特定の1行を抽出すると、集計結果が合わなくなります。 例のテーブルを、省略して提示してしまったので、紛らわしくなり申し訳ありませんでした。

関連するQ&A

  • ACCESS2000 テキストフィールドの一括化

    ACCESS2000で経理関係のDBを作成中です。入力テーブルの構造はおおよそ下記のとおりです。 フィールド1:科目コード(数値型) フィールド2:金額(数値型) フィールド3:備考(テキスト型) 今、科目コードごとに集計するためのクエリー及びレポートを作ろうと思っていて、金額の合計はできるのですが、備考欄も科目コード単位でまとめたいと思っています。どうすればよいのでしょうか。 (テーブル)       科目コード 金額 備考 レコード1:11    100 AAAAA レコード2:11    200 BBBBB レコード3:12     50 CCCCC レコード4:12    500 DDDDD            ↓ 集計(クエリ、レポート)       科目コード 金額の合計 備考の列記       11    300     AAAAABBBBB       12    550     CCCCCDDDDD こんな感じです。 よろしくお願いいたします。

  • Access2002の検索について

    社員マスターテーブル 社員ID   テキスト型 氏名   テキスト型 しめい   テキスト型 部署名   テキスト型 研修マスターテーブル 研修ID   数値型 研修名   テキスト型 受講リストテーブル 受付ID   数値型 受付日   日付時刻型 受講日   日付時刻型 社員ID   テキスト型 研修ID   数値型 研修受付クエリ 社員ID   テキスト型(受講リストテーブル) 氏名   テキスト型(社員マスターテーブル) しめい   テキスト型(社員マスターテーブル) 部署名   テキスト型(社員マスターテーブル) 受付ID   数値型  (受講リストテーブル) 受付日   日付時刻型(受講リストテーブル) 受講日   日付時刻型(受講リストテーブル) 研修ID   数値型(受講リストテーブル) 研修名   テキスト型(研修マスターテーブル) 社員が何の研修を受講したのか履歴がほしかったので「社員マスターテーブル」と「研修受付クエリ」を使ってメインサブフォームを作りました。 やりたい事は、このメインサブフォームに検索のボタンを作りたいのです。 社員IDまたは社員名または受講日のいずれかを入力するし検索ボタンをクリックするとメインサブフォームに結果を出したいのです。 マクロのフィルタ?をやってみたのですがよく意味が分からずできませんでした。 どうぞお手数ですがご教授頂けないでしょうか?

  • Microsoft Access 2003について

    複数のテーブルまたはクエリを使いレポートを作成したいのですが 「選択したフィールドのレコードソースにアクセスできません。テーブルとそのテーブルを基にしたクエリのフィールドを選択した可能性があります。もしそうであれば、テーブルかクエリのどちらかのフィールドだけを選択してください。」と出て作れません。 詳細は以下のとおりです。 支出テーブル ID   月   科目  金額   1    1   交際費  10     2    1   雑 費  20  3    2   交際費  30          (以下12月まで) 収入テーブル ID   月   科目   金額   1    1   仮払    10     2    1   雑収    20  3    2   仮払    20          (以下12月まで) 支出クエリ(クロス集計) 科目 1  2  3  4  5  6  7(以右12月まで) 交際 10 20  30  40  50  60  70 雑費 20  30  40  50  60  70  80 合計 30  50 70  90  110  130  150 収入クエリ(クロス集計) 科目 1  2  3  4  5  6  7(以右12月まで) 仮払 10 20  30  40  50  60  70 雑収 20  30  40  50  60  70  80 合計 30  50  70  90  110  130  150 収支レポート(作成したいレポート) 科目 1  2  3  4  5  6  7(以右12月まで) 仮払 10 20  30  40  50  60  70 雑収 20  30  40  50  60  70  80 合計 30  50  70  90  110  130  150 -------------------------------------- 交際 10 20  30  40  50  60  70 雑費 20  30  40  50  60  70  80 合計 30  50  70  90  110  130  150 ------------------------------------- 残高  0  0   0   0   0   0   0

  • ACCESSのSQLです。

    お世話になります。  ACCESS210で  勘定科目、仕訳帳、予実集計の3個のテーブルで  仕訳帳を月ー科目ID毎に集計して予実集計に反映するのに DoCmd.RunSQL ("Delete From 予実集計;") DoCmd.RunSQL ("Insert Into 予実集計(月度,科目ID,当年実績)" _ & "Select [仕訳日]-Day([仕訳日])+1 as 月初,科目ID, " _ & " sum(IIf([貸借区分] = ""借方"",[借方]-[貸方],[貸方]-[借方] as 収支) _ & " FROM 勘定科目 INNER JOIN 仕訳帳 ON ID = 仕訳帳.科目ID" _ & " WHERE 繰越FG)=False group BY [仕訳日] - Day([仕訳日]) + 1 as 月初,科目ID; ")  とすると  実行時エラー "3075" 構文エラー演算子がありませんとなります。  因みに、下記の仕訳帳クエリ(下方に記述)を用いて DoCmd.RunSQL ("Delete From 予実集計;") DoCmd.RunSQL ("Insert Into 予実集計(月度,科目ID,当年実績) _ & " Select 月初,科目ID,sum(金額) From 仕訳帳クエリ _ & " WHERE 繰越FG = False group by 月初,科目ID; ") とするとエラーなく終了するのですが、出来ればクエリーを乱用したくないのです。 ・勘定科目  ID(主キー)  勘定科目名  勘定CD  科目群ID  貸借区分(借方、貸方)  繰越FG ・仕訳帳(主キーなし)  伝票No.  仕訳日  摘要  科目ID(勘定科目.IDにリレーション)  借方  貸方 ・予実集計  月度 (主キー 仕訳日の月初=仕訳日-DAY(仕訳日)+1)  科目ID(主キー)  当年予算  当年実績  前年予算  前年実績 ・仕訳帳クエリ勘定科目.IDー仕訳帳.科目ID  伝票No.  仕訳日  摘要  科目ID  借方  貸方  月初:仕訳日-DAY(仕訳日)+1  金額:iff(貸借区分="借方",借方-貸方,貸方-借方) 長文になりましたが、宜しくお願いします。

  • ACCESSで重複データをまとめたいのですが・・・

    ACCESSでアンケートを集計しています。 顧客名簿テーブルとアンケートテーブルがあり、 2つのテーブルは顧客IDで関連しています。 各テーブルを簡略化すると以下の通りです。 <顧客名簿テーブルのフィールド> 顧客ID(オートナンバー型)、名前(テキスト型)、住所(テキスト型) <アンケートテーブルのフィールド> アンケートID(オートナンバー型)、顧客ID(数値型)、回答1(数値型)、回答2(テキスト型)、回答3(メモ型) 顧客名簿テーブルとアンケートテーブルを顧客IDでつなげたクエリを作成し、 検索フォームでアンケートの内容で検索しています。 検索で絞り込んだ顧客を、レポートを作って リスト印刷したり宛名印刷したりしたいのですが、 アンケートに数回答えてる人は何回も出てきてしまいます。 これを一人1回だけ出てくるようにしたいのですが、 どうしたらよいのでしょうか? クエリをグループ化しようとしましたが、 メモ型フィールドがあるとダメみたいです。 ACCESS97を使用し、Windows98~XP Proで動かしています。 初心者ですので細かく教えていただければ幸いです。 よろしくお願いします。

  • 【アクセス2010】フィールドの最大値のみ表示

    アクセス2010を使用しています。 下記のようなテーブルがあり、クエリを使ってそれぞれの「ID」に紐づいている「区分」の最大値のみを表示させたいです。 ID 区分 年月 10 100 2011/1/1 10 110 2011/3/8 10 150 2015/4/1 13 110  13 140  21 140 2016/12/7 21 160 2017/7/7 21 150 2017/1/8 「年月」を最大で集計すると、年月が入っていないIDが重複して出てきてしましますが、 「区分」を最大で集計しても、すべてのデータが表示されます。 アクセスを触り始めたばかりなので、詳細に(どこを押す、どの欄になにを書く等)教えていただけますととても助かります。 よろしくお願いいたします。

  • Access2000 / 「レコードを追加できません」

    こんにちは Access2000で困っております。 簡単にいいますと、フォーム上から日付/時刻型のデータを入力しようとしても 「レコードを追加できません、テーブル’T外部集計警備’の結合キーがレコードセットにありません。」と表示されうまく入りません。 テーブルの構成ですが、 ★が主キー (1)T現場台帳 ★NO(オートナンバー型) 現場記号(テキスト型) ・ ・ 省略 (2)T外部集計警備 ★NO(オートナンバー型) 現場記号(テキスト型) 警備依頼日付(日付/時刻型) 警備会社ID(数値型) 集計人数(数値型) (3)T警備会社 ★警備会社ID 警備会社名(テキスト型) ・ ・ 省略 上記テーブルはリレーションがかかっており、 (1)T現場台帳.現場記号(テキスト型)----(2)T外部集計警備.現場記号(テキスト型) (2)T外部集計警備.警備会社ID(数値型)---(3)T警備会社.★警備会社ID それぞれ、参照整合性のついたリレーションです。 更にこれらをまとめるために、Q警備会社集計クエリ(選択クエリ)をつくりフォームに利用しています。 Q警備会社集計クエリの構成 T現場台帳.担当者ID T外部集計警備.警備依頼日付 T外部集計経緯日.警備会社ID T警備会社.警備会社名 T外部集計警備.集計人数 (並べ替えや絞込みは、なし) この「Q警備会社集計クエリ」を使って フォームからウイザードを使用してフォームを作成し、警備依頼日付を入力しようとすると「レコードを追加できません、テーブル’T外部集計警備’の結合キーがレコードセットにありません。」と表示されます。 どなたか、Accessの痒いところまで手の届く方、お助けください。

  • Access リストボックス複数選択を抽出条件に

    Access リストボックスで複数選択した値をクエリの抽出条件にしたいです。 ※PC環境:Win7 Access2007 Excel2007 リストボックスで複数選択した値を取得する事はできるのですが、 クエリ実行をすると結果が0件になってしまいます。 他の方のQAなどを参考に以下を作成しましたが、ほしい結果が得られず困っています。 おわかりになる方、ご教示いただけますようお願い致します。 <動作概要> 「画面」の「リストボックス」で複数選択し、 [実行]ボタンを押して、「リストボックス」で選択した値を、「テキストボックス」にセットし、 クエリの抽出条件に、in(テキストボックス)をセットし、テーブルから合致するデータを抽出したい <リストボックス> ※年区分テーブル参照 区分,区分名 1,1年 2,2~3年 3,4~5年 「2,2~3年」「3,4~5年」を選択 ※「区分」は数値型 <VBA> Private Sub 実行_Click()  Dim i As Variant  Me.テキストボックス = Null  For Each i In Me.リストボックス.ItemsSelected Me.テキストボックス = Me.テキストボックス & Me.リストボックス.Column(0, i) & "," Next If Me.テキストボックス <> "" Then  Me.テキストボックス = Left(Me.テキストボックス, Len(Me.テキストボックス) - 1) End If   'ここで画面を確認すると「テキストボックス」には、「2,3」 がセットされている DoCmd.OpenQuery "クエリ"   'テーブルには抽出条件に該当するデータがあるが、クエリ実行結果は0件 End Sub <クエリ SQL> SELECT テーブル FROM テーブル WHERE (((テーブル.区分) in([Forms]![画面]![テキストボックス]))); ※「テーブル.区分」は、数値型 どうぞよろしくお願い致します。

  • Access #エラーについて

    Access初心者です。 よろしくお願いいたします。 [前提]  テーブルA のIDに紐づけてクエリBの数値をクエリCで反映させたい。  〈詳細データ〉   ・テーブルA    [ID] [名称]       1   あ     2   い     3   う     4   え     5   お   ・クエリB    [ID] [数値]     2   10     3   20     5   40   ・クエリC    [ID]  [名称] [数値]     1    あ  #エラー     2    い   10     3    う    20     4    え  #エラー     5    お   40   ・”テーブルAの[ID]”の全レコードと”クエリBの[ID]”の同じ結合フィールドだけを含めてリレーションを行っている。    ・クエリCの算式: IIf(IsError([クエリB].[数値]),0,[クエリB].[数値])  [質問]    ・クエリCの『#エラー』部分を0にしたいのですが、何か良い方法はございませんでしょうか。   ・そもそも上記のロジックは無理がありますでしょうか。    アクセスはあまりいじったことがございません。ご回答いただけますと幸いです。   よろしくお願いいたします。

  • ACCESS 更新クエリについて

    更新クエリで更新したいのですが、クロス集計クエリの数値を元にテーブルを更新することは出来ないようで、困っています。 なぜそのようなことをしているかと申しますと、 商品品目_個数_コード(主キー) のようにフィールドを持っているのですが、 印刷に関しては品目ごとに印刷したい、ということで 一度クロス集計クエリ(TRANSFORM)で りんご_ばなな_ぶどう_コード(主キー) 数値_数値_数値_数値 のような並びにして、テーブル作成クエリでテーブルを作成し そのテーブルをレポートに使用しています。 数値などが変わった場合その作成したテーブルの数値を 作成元になったクロス集計クエリで更新したいのですが、出来なくて困っています。 テーブル作成クエリで上書きすると、古いデータが消えてしまうため 何か良い方法はないかと思っています。 回答のほどお願いします。