• 締切済み

アクセスのクエリについて(前当期比較させたい)

現在、アクセス2010を勉強中の超初心者です。 アクセスを用いて、前期と当期の商品売上数量比較表(得意先ごとの)を作成できないか考えております。  ■さっそくですが、以下の4つのテーブルがあったと仮定します。 テーブル(1)(商品マスター)           テーブル(2)(得意先マスター) 品コード | 品名                  店コード |  店名   1    | ○○                       A  |  あか   2    | ××                       B  |  いき   3    | △△                       C  |  うす テーブル(3)(前期売上データ)          テーブル(4)(当期売上データ) 店コード | 品コード | 売上数量         店コード | 品コード | 売上数量  A     |   1    |  10               A      |   3     |  20     A     |    3     |  15             A      |    4     |  25     B     |    1     |  17              B     |    2    |  27     :     |    :    |  :               :     |    :     |  :     ■以下のようなデータ抽出できないかを検討しています。 店コード | 品コード | 前期売上数量 | 当期売上数量   A    |    1     |     10       |     0   A    |    3      |     15       |     20   A    |   4      |     0       |     25  ◆自身で検討してみましたが、「前期に売上実績があるが、当期に売上実績がないケース」、及び「その逆のケース」についてうまく抽出できません。(上記例で言いますと、A店に対する売上で品コード1 と 品コード3 の商品売上数量比較ができませんでした。)  解決方法わかる方、ご教授のほどよろしくお願い致します。

みんなの回答

回答No.4

> ただ、この方法を用いた場合ですと、前期に売上実績があり、後期に売上実績がない場合、前期の分しか表示されない状態になりました。(109期の列自体が表示されませんでした) 後期の売上実績が0件、言い換えると、「後期売上データ.」のレコード件数が 0 の場合は、後期の列は表示されません。 そういうことでしょうか。 もし、そうなら、クロス集計クエリをデザインビューで開き、ビューの上部のテーブルの背景部分をクリックして、 クエリプロパティを表示させます。そこの、「クエリ列見出し」を "前期","後期" と設定すれば、「後期売上データ.」のレコード件数が 0 でも、後期の列は表示されます。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

SQLを考える時は理論の組み立てが肝要で、闇雲に作ったり、 人の作ったものをマネしても永久にウマくなれません。 先ず、前期の数量を考えます。次に今期の数量を考えます。 (1)店別、品別、前期数量 (2)店別、品別、今期数量 これを店コード、品コードで結合すれば9割は完成です。 ここまでは質問者さんにもできていると思います。 問題は「前期だけにある」と「今期だけにある」ものの 取り扱いです。始めに前期を中心に今期を見ます。 (3)店別、品別、前期数量 ⇒ 店別、品別、今期数 つまり、(1)⇒(2)です。 こうすると、前期と、今期(前期にあったものだけ)の抽出が できます。残りは「今期だけ」のものです。 (4)店別、品別、今期数量(但し、前期にないもののみ) ここまでくれば、(3)+(4)が求めるものであることが理解 できると思います。 (1)店別、品別、前期数量 SELECT 店コード,品コード,SUM(売上数量) AS 前期数量 FROM 前期売上データ GROUP BY 店コード,品コード (2)店別、品別、今期数量 SELECT 店コード,品コード,SUM(売上数量) AS 今期数量x FROM 今期売上データ GROUP BY 店コード,品コード (3)店別、品別、前期数量 ⇒ 店別、品別、今期数 SELECT A.店コード,A.品コード,A.前期数量,NZ(B.今期数量x,0) AS 今期数量 FROM (SELECT 店コード,品コード,SUM(売上数量) AS 前期数量 FROM 前期売上データ GROUP BY 店コード,品コード) AS A LEFT JOIN (SELECT 店コード,品コード,SUM(売上数量) AS 今期数量x FROM 今期売上データ GROUP BY 店コード,品コード) AS B ON A.店コード=B.店コード AND A.品コード=B.品コード ※前期にあって、今期にないと「今期数量」はNULLになる。  表示上は空欄になるので、NZ関数で「NULLなら0」とした。 (4)店別、品別、今期数量(但し、前期にないもののみ) SELECT A.店コード,A.品コード,0 AS 前期数量,SUM(売上数量) AS 今期数量 FROM 今期売上データ AS A LEFT JOIN 前期売上データ AS B ON A.店コード=B.店コード AND A.品コード=B.品コード WHERE B.店コード IS NULL GROUP BY A.店コード,A.品コード ※B(つまり前期)が結合しないとB側の項目はNULLになる。 (3)と(4)を結合して、店コードと品コードで並べ替える SELECT A.店コード,A.品コード,A.前期数量,NZ(B.今期数量x,0) AS 今期数量 FROM (SELECT 店コード,品コード,SUM(売上数量) AS 前期数量 FROM 前期売上データ GROUP BY 店コード,品コード) AS A LEFT JOIN (SELECT 店コード,品コード,SUM(売上数量) AS 今期数量x FROM 今期売上データ GROUP BY 店コード,品コード) AS B ON A.店コード=B.店コード AND A.品コード=B.品コード UNION ALL SELECT A.店コード,A.品コード,0 AS 前期数量,SUM(売上数量) AS 今期数量 FROM 今期売上データ AS A LEFT JOIN 前期売上データ AS B ON A.店コード=B.店コード AND A.品コード=B.品コード WHERE B.店コード IS NULL GROUP BY A.店コード,A.品コード ORDER BY 1,2 ※結合はUNIONで、この場合はフィールド名ではなく列位置でORDER句を  指定します。 左が主体で右を見る方法(前述の⇒)がまさしくLEFT JOINです。

yuzuzx
質問者

お礼

ご回答ありがとうございます。 あなた様のおっしゃる通り、真似しただけではスキルは身に付きませんね。 それぞれの方から教えて戴いた方法を理解しながら、少しずつ身につけたいと思います。 あなた様の指導していただいた方法もなんとか理解できました。全くの初心者だったので非常に長い構文に抵抗ありつつも、一つ一つ解読していけました。 As , Nz , NULLあたりが何を示しているのか最初全然わからず、ググっていたためお礼遅くなりました。 ありがとうございました。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

違う方法のものを 前期売上データ / 当期売上データ にある 店コード, 品コード を一塊りにし、 別名「Q0」を付けておきます (SELECT 店コード, 品コード FROM 前期売上データ UNION SELECT 店コード, 品コード FROM 当期売上データ) AS Q0 これを元に、前期売上データ / 当期売上データ と LEFT JOIN で 店コード, 品コード を結び付け SELECT Q0.店コード, Q0.品コード, Q1.売上数量 AS 前期売上数量, Q2.売上数量 AS 当期売上数量 FROM ((SELECT 店コード, 品コード FROM 前期売上データ UNION SELECT 店コード, 品コード FROM 当期売上データ) AS Q0 LEFT JOIN 前期売上データ AS Q1 ON Q0.店コード=Q1.店コード AND Q0.品コード=Q1.品コード) LEFT JOIN 当期売上データ AS Q2 ON Q0.店コード=Q2.店コード AND Q0.品コード=Q2.品コード; もし、各テーブルの中で、店コード, 品コード が重複しているのなら 上記を Q0.店コード, Q0.品コード でグループ化するようにします。 SELECT Q0.店コード, Q0.品コード, Sum(Q1.売上数量) AS 前期売上数量, Sum(Q2.売上数量) AS 当期売上数量 FROM ((SELECT 店コード, 品コード FROM 前期売上データ UNION SELECT 店コード, 品コード FROM 当期売上データ) AS Q0 LEFT JOIN 前期売上データ AS Q1 ON Q0.店コード=Q1.店コード AND Q0.品コード=Q1.品コード) LEFT JOIN 当期売上データ AS Q2 ON Q0.店コード=Q2.店コード AND Q0.品コード=Q2.品コード GROUP BY Q0.店コード, Q0.品コード;

yuzuzx
質問者

お礼

回答ありがとうございます。 突然、長いSQLが出てきたので、解読に時間を要してしまいましたが、理解できました。 こちらの方法を用いた場合、前期に売上実績あり、当期に売上実績なしの商品等に対して、空白で表示されるので、回答者No,3の方がおっしゃるようにNz関数を用いて対処すれば希望通りに表示できました。 ありがとうございました。

回答No.1

ユニオンクエリで前期データと当期データを連結します。 クエリのSQLビューで下記のSQLを記述してください。 SELECT "前期" AS 期, 前期売上データ.* FROM 前期売上データ UNION ALL SELECT "後期" AS 期, 後期売上データ.* FROM 後期売上データ; このクエリを保存します。 このクエリよりクロス集計クエリを作成して、下記のように設定します。 フィールド / 集計 / 行列の入れ替え 店コード / グループ化 / 行見出し 品コード / グループ化 / 行見出し 期 / グループ化 / 列見出し 売上数量 / 合計 / 値 以上です。 ちなみに、データベースでは、ユニオンクエリの結果のようなテーブルにするのが、正しい設計といえます。

yuzuzx
質問者

お礼

ご回答ありがとうございます。 SQLを直接記述したことがなく、UNION ALLについてネットで色々検索したところ、内容理解できました。 ただ、この方法を用いた場合ですと、前期に売上実績があり、後期に売上実績がない場合、前期の分しか表示されない状態になりました。(109期の列自体が表示されませんでした) 私のやり方が間違っていたのかもしれませんが、大変勉強になりました。 ありがとうございます。

関連するQ&A

  • Accessのクエリ(初心者)

    Access超初心者です。 クエリで悩んでいるので、お教えください。 テーブル1に CODE(商品ID)_NAME(名前)_SUU(数量)_DAY(日付)の4項目があり、 クエリを使って、最も大きいSUUを抽出したい (かつ最も大きいSUUのデータが重複している場合、その中で最も古い日付のデータのみを抽出したい)のですが・・・ たとえば、 テーブル内容: CODE(商品ID)_NAME(名前)_SUU(数量)_DAY(日付) A_あめ_600_0517 A_あめ_900_0518 A_あめ_400_0618 B_ガム_120_0217 B_ガム_060_0319 B_ガム_180_0718 B_ガム_180_0518 抽出結果: A_あめ_900_0518 B_ガム_180_0518 ということです。 デザインビューを使うとして、どのような方法がありますでしょうか? どうかご教授お願いします!

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

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

  • アクセスのデータ抽出

    現在テーブルA(支店コード、支店名、郵便番号、住所)とテーブルB(支店コード、社員番号、商品Aの売上数、商品Bの売上数・・・※商品名ごとにレコードを持っています。)の2つのテーブルを使っています。 これをクエリで抽出しているのですが、社員一人につきひとつのレコードしか抽出されません。 売上のない支店も全て抽出し、実績報告書として印刷するため、テーブルAとBに結合のプロパティでテーブルAの全てを選んでいるため、これ以外の方法でテーブルBのデータ全てを抽出したいのですが、何か方法はありますか?

  • アクセスのクエリの作り方

    初心者なので教えてくださいませんか? アクセスでテーブルを複数作成して、それをクエリで結合するときに、どのテーブルからどのフィールドを選べばいいのかわかりません。 例えば・・・ 売上テーブル:NO 売上日 商品コード 数量 商品テーブル:商品コード 商品名 単価 この二つのテーブルを結合するクエリを作ります。 NO 売上日 商品コード 商品名 単価 数量 上記のフィールドを使用したいのですが、このとき、商品コードをどちらのテーブルのを使ったらよいのでしょう。 その判断は何からしたらよいのでしょうか。 うまく説明できているかわかりませんが、よろしくお願いします。

  • 「Access2000」クエリー作成についてお教えください。

    たとえば、売上テーブルから売上先、商品、数量を抽出するクエリーを作成する場合、数量分のレコードを発生させたいのですが・・・。 つまり、売上テーブルに次のレコードがあったとき・・・  A商店 りんご 3個  B商店 みかん 2個 クエリーには以下のように表示させたいのですが・・・  A商店 りんご 3  A商店 りんご 3  A商店 りんご 3  B商店 みかん 2  B商店 みかん 2 以上、よろしくお願いします。

  • アクセスのクエリで

    テーブルAには、商品コードと数量と金額。 テーブルBには、商品コードと空のフィールド。 テーブルBにAのテーブルを参照して、該当する商品コードの金額を空のフィールドにコピーしたいのですが、どうしたらいいでしょうか。 SQL文で書いて頂いても結構です。 よろしくお願い致します。

  • Access2000 #Name?を式で判断して回避することはできますか?

    初めて質問させていただきます。LenBと申す者です。よろしくお願いいたします。 ソフトウェア:Access 2000 OS:Windows 2000(SP4) フォームのテキストボックスのエラー表示#Name?(コントロールソースに指定された名前が見つからない)を関数など、何らかの手段で判断して、""あるいは0を表示することはできないでしょうか。(IsErrorのように) #Name?が表示されてしまうと、フォームフッターで合計が計算できません。 ちなみに、フォームのレコードソースには、以下のようなSQLを入れています。 TRANSFORM Sum([売上実績].[金額]) AS 金額 SELECT [売上実績].[商品コード], [商品マスタ].[商品名] FROM 商品別予算 INNER JOIN 商品マスタ ON [売上実績].[商品コード]=[商品マスタ].[商品コード] GROUP BY [売上実績].[商品コード], [商品マスタ].[商品名] PIVOT [売上実績].[月]; テーブル[売上実績]のレイアウト [年]、[月]、[商品コード]、[数量]、[金額] (主キー:[年]、[月]、[商品コード]) テーブル[商品マスタ]のレイアウト [商品コード]、[商品名] (主キー:[商品コード]) テーブル[売上実績]は、一つの商品コードについて、1月から12月までの12レコードが全てあるとは限りません。 ・売上実績が0の月はレコードを追加していません。(データサイズを少しでも小さくするため) ・発売前、生産終了後の月についてはレコードを追加しません。(レコードを追加するのは少々困難です。)

  • Access 抽出漏れ行をみつけるクエリ

    図のようなテーブル「TBL_A」がCSVファイルの形で提供されます。この「TBL_A」は全レコードのテーブルあり「正」データばかりのマスターと考えてください。 このCSVデータをACCESSによみこみテーブル「TBL_A」としてあります。 「TBL_A」をいろいろな人が加工したり、抽出作業をしているのですが、「TBL_B」のような抽出をかけて渡してきた人がいたので、「データ(レコード)が足りないので、不一致クエリで足りないのを見つけておいてください」と頼んだところ、何度やってもみつけられないというので、自分でも試してみました。 図でいえば、ピンク色のレコード(行)をみつければいいのですが、Accessで不一致クエリをかけてみたところ、図の下部のようなデータしか抽出できませんでした。 やったことは2つ 1) TBL_Aを左にし、右にTBL_Bを右に配置し、不一致クエリウィザードでの矢印(→)で商品コードを紐付けた 2) 最初にTBL_AとTBL\Bをクエリで「商品コード」「価格」ぞれぞれ結びつけ(つまり2つの線)、「商品コード」「価格」を「クエリ1」として抽出。その「クエリ1」を上のTBL_Bの位置にもってきて、不一致クエリ。 どちらとも、結果は図の下のようになってしまいます。 図の上部のピンクの部分を確実に抜き出すには、どのようなクエリ(またはSELECT文)が必要でしょうか。 メモ: ・商品コードは「テキスト型」です。 ・商品コードが同じでも販売場所やいろいろな経緯で価格が違っていたり、返品の場合は返金するためマイナス金額がつくことがあり、商品コードと価格はかならずしも合致しません。 ・Accessは2010か2013を使っています。 ※今回はVBAの質問ではありません。

  • Access DLOOKUPについて

    Access DLOOKUPについて こんにちは。Access2010でのDlookupについてお教えください。 ■注文テーブル オーダーID,商品コード,数量,お店番号 001,A01,1,お店1号 001,A02,5,お店1号 002,B01,3,お店2号 002,B02,3,お店2号 ※同一オーダーIDで商品コードが重複する事は無 ■確認用注文テーブル 商品コード,数量,お店番号 A01ですよ,1お店1号 B02です,3,お店2号 ※なんと、オーダーIDがありません。さらに商品コードに変な文字列も入っています。 ■やりたい事 フォームに「判定」というテキストボックスを配置しました。 コントロールソースで以下の条件にあっているなら○、あっていないなら×と表示したいです。 ○注文テーブル.商品コードと確認用注文テーブル.商品コードを比較。 注文テーブル.商品コードのデータが確認用注文テーブル.商品コードに含まれていること。 ○注文テーブル.数量と確認用注文テーブル.数量がイコールであること。 ○注文テーブル.お店番号と確認用注文テーブル.お店番号がイコールであること。 これらを満たしていれば、○、満たしていなければ×と表示したいです。 Dlookupでなくても、何か他に方法がありましたらお教えください。 宜しくお願いします。

  • Access 選択クエリーの抽出条件

    Access2000を使っています。 選択クエリーの抽出条件にテーブルの値を設定することは可能でしょうか? たとえば、テーブルAに対して、抽出条件をテーブルBのデータでコード番号 ”B*”(コード番号にBのつくもの)を抽出したいのですが・・・。 よろしくお願いします。