集計クエリの実践方法

このQ&Aのポイント
  • クエリを使用して実績1と実績2を集計する方法をご紹介します。
  • 集計クエリ結果には商品コード、商品名、合計使用重量が含まれます。
  • 一つのクエリ内で処理することができるので、効率的にデータを集計できます。
回答を見る
  • ベストアンサー

集計クエリについて

注文データ ・注文番号(重複なし) 商品テーブル ・商品コード ・商品名 実績1 ・注文番号 ・商品コード ・出庫日 ・使用重量 実績2 ・注文番号 ・商品コード ・出庫日 ・使用重量 上記4つのテーブルがあり、それぞれ下記の内容が入っています。 注文データ A01 A02 A03 A04 商品テーブル S01 あずき S02 いちご S03 りんご 実績1 A01 S01 2015/9/1 10.00 A02 S02 2015/9/2 10.00 A04 S01 2015/9/4 10.00 実績2 A01 S01 2015/9/1 10.00 A03 S03 2015/9/3 10.00 A04 S01 2015/9/4 10.00 クエリを使用して実績1と実績2を下記のように集計するにはどのようにしたら良いでしょうか。 一つのクエリ内で処理したいです。 集計クエリ結果 S01 あずき 20.00 S02 いちご 10.00 S03 りんご 10.00

  • tdosj
  • お礼率22% (35/153)

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

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

実績1、実績2 に共通する注文番号は、重複データとして 1件のみ集計の対象とする、といことですね? 同じ注文番号で、違う値のフィールドがあると 重複して集計されるので もう一工夫する必要があります。 SELECT T.商品コード, T.商品名, Sum(Q.使用重量) AS 使用重量の合計 FROM 商品テーブル AS T INNER JOIN (SELECT * FROM 実績1 UNION SELECT * FROM 実績2) AS Q ON T.商品コード = Q.商品コード GROUP BY T.商品コード, T.商品名 実績のない商品もすべて表示したい場合は INNER JOIN を LEFT JOIN に変えてください。 > 一つのクエリ内で処理したいです。 ということなので、サブクエリを使い、分かりにくいものになっています。

tdosj
質問者

お礼

有難うございます。 そういえばUNIONがありましたね。 SQLを手打ちするのが面倒なのでクエリで楽してましたが、やはりダメですね。 >ということなので、サブクエリを使い、分かりにくいものになっています。 いえいえ、全然分かりにくくないです。

その他の回答 (2)

回答No.3

>S01 あずき 20.00 って、添付図のようなことだったとは・・・。 さて、そういう集計が成立するには、実績の重複が商品、使用数量まで完全に同じということ。でないと変なことになるかと・・・。だったら、合計を重複数で除した結果が求めるもの。添付図は、そういう考えに基づいています。

tdosj
質問者

補足

おそらく読解力の問題かと。

回答No.1

SELECT   実績.商品コード,   商品テーブル.商品名,   Sum(実績.使用数量) AS 使用数量の合計 FROM 実績   LEFT JOIN 商品テーブル   ON 実績.商品コード = 商品テーブル.商品コード GROUP BY 実績.商品コード, 商品テーブル.商品名; 一般的には、このようなSQLになると思いますよ。この場合は、実績テーブルを次のように加工しています。 【実績】 注文番号 区分 <------- 1=実績1、2=実績2 商品コード 出庫日 使用数量 PS、現行のテーブル構造のままですと DSUM()を使えば・・・。 SELECT   商品テーブル.商品コード,   商品テーブル.商品名,   DBLookup("SELECT SUM(使用数量) FROM 実績1 WHERE 商品コード='" & [商品コード] & "'") AS 実績1_使用数量,   DBLookup("SELECT SUM(使用数量) FROM 実績2 WHERE 商品コード='" & [商品コード] & "'") AS 実績2_使用数量 FROM 商品テーブル; ここではSQL文を判りやすくするために自作のDBLookup()を使っていますがDSum()で書けます。 [実績1_使用数量]+[実績2_使用数量] AS 合計使用数量 でも、冒頭のやり方がお薦めです。現行のテーブル設計は、色々と問題が多いように思います。 ※もうすぐ70歳を迎える爺の感想。無視してもらっても結構ですよ。

tdosj
質問者

補足

有難うございます。 「あずき」の合計は「40」ではなく「20」です。

関連するQ&A

  • アクセス クエリ・集計・計算方法について

    アクセスの集計機能を使用して、品名毎の数量の合計と金額の合計を算出しようとしていますが、 思うようにできません。どなたか教えてください。 クエリのフィールドを左から・・・ (1)年月: Format([日付],"yyyy/mm")(集計:グループ化) (2)品名(集計:グループ化) (3)品名のカウント(集計機能:カウント) (4)単価(集計:グループ化) (5)金額: [単価]*[品名のカウント](集計:グループ化) このような形でクエリを実行していますが、すべての注文が1つだけなら問題ないのですが、実際には品名には数量が掛けられている場合もあり、現在設定しているクエリ設定では正しい数量の合計と金額の合計を出すことができません。どうか集計方法をご教授いただけないでしょうか。よろしくお願いします。 ■現在のテーブルの設計とリレーションを明記します。 【A】顧客テーブル (1)顧客ID (2)発注コード (3)氏名 【B】商品テーブル (1)商品ID (2)品名 (3)単価 【C】注文テーブル (1)注文ID (2)日付 (3)顧客ID 【D】注文明細テーブル (1)注文明細ID (2)注文ID (3)商品ID (4)数量 リレーション 【A】(1)-【C】(3) 【B】(1)-【D】(3) 【C】(1)-【D】(2)

  • Accessのクエリによる集計が出来ない

    Accessのクエリによる集計が出来ない kamuycikapです。 OKWaveで様々な方のアドバイスを頂きながら、慣れないAccessと悪戦苦闘しております。 一昨日、計算したい表を作成する為にOKWaveに質問を載せました。 http://okwave.jp/qa/q5549286.html 無事に上記のアドバイスでリレーションのオプション設定を行い、集計計算したいクエリの結果を表示することが出来ました。 その表を元にして 下記の質問でアドバイス頂いた方法による集計を行おうとしたのですが、集計出来なくて困っています。 http://okwave.jp/qa/q5544785.html データベースの構成とキーは以下のとおりです。 --ここから <データベース構造:リレーションシップ> リレーションシップとテーブルの構成は下記の通りです。 -->がリレーションシップです。 Kがキーになります。 ■テーブルA      ■テーブルB    ■テーブルC    ■テーブルD K納品書コード --> K納品書コード --> K納品書コード  --> K納品書コード 仕入数          K商品コード  --> K商品コード   --> K商品コード                             K商品連番    --> K商品連番                             出品数量        K出品連番                             商品名           発送個数                             色             発送日付                             サイズ                             売値 ※テーブルCからテーブルDへのリレーションオプションを「’テーブルC’の全レコードと’テーブルD’の同じ 結合フィールドのレコードだけを含める。」としています。 <作りたいデータ> 納品書コード、商品コード、商品連番、商品名、色、サイズ、売値、仕入数、出品数量、発送個数、出品在庫数、倉庫在庫 <クエリ> ○グループ  納品書コード、商品コード、商品連番、商品名、色、サイズ、売値、仕入数、出品数量 ○合計(集計)  発送個数 ○出品在庫数(演算)  [出品数量]-[発送個数] ○倉庫在庫(演算)  [仕入数]-[発送個数] <データ状況> テーブルCのデータは約300レコードありますが、そのうち20件ほどしか商品が発送されていない為、テーブルDのデータは20件しかありません。 <望む結果> テーブルCのデータが全て表示され、紐つけられたテーブルDのデータがが存在する場合は、発送個数を表示し出品在個数を演算する。 演算した出品在個数を利用して、倉庫在庫も演算する。 <クエリの実行結果> テーブルCのデータが全て表示され、テーブルDに紐つけられたレコードも表示されるが、テーブルDに入力されている20件のデータが商品連番(テーブルCのフィールド)ごとに集計されない。 --ここまで <目的> お店に出品された商品は、日を分けて少しずつ売れていきます。(一日で全部売れることもありますが....) 従って、出品された商品(テーブルCのデータ)に対して売れていく数(テーブルDの複数のレコード)のデータがぶら下がっている形になります。 このようなデータベースですので、出品した商品が何個売れたかを計算する為には、商品に対する売れた個数を集計(合計)しなければなりません。 <結果> テーブルCの商品連番ごとの発送個数を集計したいのですが、テーブルDの出品連番ごとの集計になっている様子です。 <頂きたいアドバイス> 上記のデータベースとクエリで、テーブルCの商品連番に紐ついたテーブルDに格納されている発送個数の合計値を集計するための方法 以上、識者の方のアドバイスをお願い致します。

  • 集計クエリで

    Access2002を利用しています。 集計クエリで、たとえば、商品ごとの重量*料金の合計(送料)を取りたいとした時、 フィールドの欄で、送料:Sum([重量]+[料金])で、集計を演算とするのと 送料:[重量]*[送料]として、集計で合計とするのでは、どうちがうのですか? 例がおかしいとおもうのですが、フィールドで集計関数を入れて、集計欄で演算とするのと、 フィールドに式を入れて、集計で合計とするのとどちらが正しいのか、またこの両者は違うのかを教えてください。

  • access クエリで集計した数値を別クエリで使いたい

    access2003で2000ファイル形式で以下のものを作っています。 テーブル「A」(フィールドは登録番号(主キー)、 書名) 「B」(登録番号(主キー)、 書名) がある。Aの「登録番号の最大値」(100とする)をクエリ(クエリ名「集計クエリ」)で集計して得た。 テーブルBの登録番号(1~30とする)を更新クエリで(1+100 ~ 30+100)に更新したい。そこでデザインビューで登録番号フィールド(テーブルB)の「レコードの更新」欄にビルダーで「[B]![登録番号]+[集計クエリ]![登録番号の最大値]」と入力して実行したら 実行できなかった。(仕方ないので「[B]![登録番号]+100」として実行したら更新できた。)今後もあるので「集計クエリ」で得た値を直接呼んで、更新クエリを実行したいのだが・・・。 わかりにくい質問で恐縮です。ご理解頂けたならば、ご教授ください。

  • Accessのクエリ集計について

    Accessのクエリ集計について kamuycikapです。 テーブルを集計するクエリについて悩んでいます。 以下がテーブルの状況と試行錯誤しているクエリ。 そして実行結果の箇条書きです。 非常に長文ですが、識者の方のアドバイスをお願い致します。 --ここから <データベース構造:リレーションシップ> リレーションシップとテーブルの構成は下記の通りです。 -->がリレーションシップです。 ■テーブルA      ■テーブルB    ■テーブルC    ■テーブルD 納品書コード ーー> 納品書コード ーー> 納品書コード  ーー> 納品書コード 仕入数          商品コード  ーー> 商品コード   ーー> 商品コード                               商品連番    ーー> 商品連番                               出品数量        出品連番                               商品名           発送個数                               色             発送日付                               サイズ                               売値 <作りたいデータ> 納品書コード、商品コード、商品連番、商品名、色、サイズ、売値、仕入数、出品数量、発送個数、出品在庫数、倉庫在庫 <クエリ> ○グループ  納品書コード、商品コード、商品連番、商品名、色、サイズ、売値、仕入数、出品数量 ○合計(集計)  発送個数 ○出品在庫数(演算)  [出品数量]-[発送個数] ○倉庫在庫(演算)  [仕入数]-[発送個数] <データ状況> テーブルCのデータは約300レコードありますが、そのうち20件ほどしか商品が発送されていない為、テーブルDのデータは20件しかありません。 <望む結果> テーブルCのデータが全て表示され、紐つけられたテーブルDのデータがが存在する場合は、発送個数を表示し出品在個数を演算する。 演算した出品在個数を利用して、倉庫在庫も演算する。 <クエリの実行結果> テーブルCのデータが全て表示されず、テーブルDに紐つけられたレコードのみが表示されるため、約300件のデータではなく、テーブルDに入力されている20件しか表示されない。 --ここまで 目的は、テーブルCのデータを全て表示し、発送情報がテーブルDに入力されているデータについては演算結果を表示する事です。 現状では、テーブルDのデータしかテーブルCのレコードが表示されません。。。。 どうすれば目的のデータを収集できるクエリが作成で切るのか、識者の方のアドバイスをお願いします。

  • ACCESSのクエリーで

    ACCESSのクエリで たとえば下記のテーブルがあったとき コード 品名 1   商品001 3   商品003 4   商品A 7   商品BB と有ったときACCESSのクエリで 1   商品001 2 3   商品003 4   商品A 5 6 7   商品BB のようにテーブルに無いコードのところは空番にしないで 番号をだけを付けるのは可能でしょうか? もとのテーブルはいじりたくないので・・・ もし、やり方が有るならば教えてください

  • ACCESS 更新クエリについて

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

  • Oracle クエリ

    Oracle クエリ 元テーブル R1  R2 A  リンゴ A  イチゴ B  マンゴ C  イチゴ C  マンゴ この形のテーブルを R1 リンゴ イチゴ マンゴ A   1   1 B           1 C       1   1 変更したです。 オラクルSQLを使って、 ちなみに ORACLE 10G です。 宜しく御願いします。

  • Access2003でクエリーを作った場合。。。

    選択クエリー作成時に、実績データのテーブルと商品マスタのテーブルで 商品コードを結合させたのですが、うまく抽出できませんでした。 ACCESS2003使用です。 <実績データの商品コード>  AAA ← 半角 <商品マスタの商品コード>  AAA ← 半角  AAA ← 全角 商品マスタに、半角と全角が存在していた場合、どちらとも一致していると みなされダブって集計されてしまいました。 ACCESS97では半角と全角では不一致と判断していたのですが、2003 で同じクエリーを作ったところ、半角と全角でも一致とみなされているようです。 半角と全角では「不一致」とする方法を教えてください。

  • Accessユニオンクエリーで2つのテーブルを集計

    Accessのユニオンクエリーで2つのテーブルを集計したいのですが Aテーブル コード1 値 1    5 1    2 Bテーブル コード2 値 1    1 2    3 結果 コード 値 1    8 2    3 このような結果を得ることは出来ますでしょうか? SELECT Aテーブル.コード1 AS コード,Aテーブル.値 UNION SELECT Bテーブル.コード2 AS コード,Bテーブル.値 このように記述すると コード 値 1    5 1    2 1    1 2    3 このような結果になってしまうのですが・・

専門家に質問してみよう