Accessについて 以前の質問なのですが、⇒以下前文です。(一ヶ月毎の在庫数を抽出したテーブル1,2,3にそれぞれ商品名、JANコード、在庫数というフィールドがあるとします(レコード数はそれぞれバラバラとします。)テーブル1にある商品名のフィールドを基準とし、その商品の在庫数の推移をクエリでつくりたいのですが、その辺のリレーションの作り方がわかりません。完成のイメージとしてはフィールドはテーブル1の商品名、JAN、在庫数、テーブル2の在庫数、テーブル3の在庫数という感じです。よろしくお願い致します。)

回答をいただいたのですが、全くの初心者で回答いただいた構文をどこで作ればいいのかさえわかりません。今の状況は新しいmdb.ファイルに上記で説明したテーブルが3つあるという状態です。Access2003です。不明な点だらけだとは思いますが、よろしくお願い致します。 

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2006/11/24 14:49:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント23pt

http://q.hatena.ne.jp/1162269450 で回答いただいたSQL文はクエリに書き込みます。

新しいクエリを作ってSQLビューに切り替えます。

  ↓

その中に回答いただいたSQLを入力します。

  ↓

データシートビューに切り替えて望みの結果となっているかを確認します。

id:hac20380

SELECT テーブル1.商品名, テーブル1.JAN,テーブル1.在庫数,

IIF (IsNuLL(テーブル2.在庫数),0,テーブル2.在庫数)

IIF (IsNuLL(テーブル3.在庫数),0,テーブル3.在庫数)

FROM (テーブル1

 

LEFT JOIN テーブル2 ON テーブル1.商品名 = テーブル2.商品名)

LEFT JOIN テーブル3 ON テーブル1.商品名 = テーブル3.商品名)

ORDER BY テーブル1.商品名

2人目の方の回答を参考にこのように書いたのですが、2,3行めがエラーとなりますというメッセージがでるのですが、どこがおかしいのでしょうか?

2006/11/20 19:51:29
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント23pt

SELECTテーブル1.商品名

 ,テーブル1.JAN

 ,テーブル1.在庫数 AS 当月在庫

 ,Nz(テーブル2.在庫数,0) AS 前月在庫

 ,Nz(テーブル3.在庫数,0) AS 前々月在庫

FROM (テーブル1

 LEFT JOIN テーブル2 ON テーブル1.商品名 = テーブル2.商品名)

 LEFT JOIN テーブル3 ON テーブル1.商品名 = テーブル3.商品名

ORDER BY テーブル1.商品名

(1)SELECT句・・・どのような結果がほしいかを記述する場所

  IIF関数とIsNull関数の組み合わせでも良いですがNz関数という便利なものが用意されているので代えてます。

  AS句でフィールド名を付けました。AS句が無いとExpr1000、Expr1002といったような番号が付けられてしまうので後々になって使いづらくなります。上記ではテーブル1が当月、テーブル2が前月、テーブル3が前々月とみなして名前を付けましたが適宜お好きな名前をつけてください。

(2)FROM句・・・どのテーブルのデータを使うかを記述する場所

一番最後の括弧が余分です。

(3)ORDER BY句・・・出てきた結果をどの順番で並べるかを記述する場所

余談になりますが、

ORDER BY テーブル1.在庫数 DESC,テーブル1.商品名

と書けば在庫数を降順に、在庫数が同じ場合は商品名順で並べるという事ができます。


さらに余談ですが、、、、

上記では行を分けて書いてますが、Accessのクエリは保存した時に勝手に行を繋げたり[角括弧]を勝手につけたり(括弧)の数を増やしたりしますので、次回SQLビューで開いた時に行が繋がったり[角括弧]がついていたり(括弧)が増えていても驚かないでください。

[角括弧]はフィールド名などに自動的に付加されますが、どのような基準で行を繋げたり(括弧)を付加しているのかは知らないです。

id:hac20380

ありがとうございます。ただ、全くこのままコピペしたのですが、”SQLステートメントが正しくありません。'DELETE''INSERT''PROCEDURE''SELECT'または'UPDATE'を使用して下さい。とメッセージがでてしまいます・・

2006/11/22 15:16:11
id:kn1967 No.3

回答回数2915ベストアンサー獲得回数301

ポイント54pt

済みません。

SELECT と テーブル1.商品名 の間に空白が入ってなかったです。

SELECT テーブル1.商品名

id:hac20380

今度はクエリ式 'テーブル1.商品名'の構文エラー :演算子がありません と出てしまいました。

恐らく一番上の部分だとおもわれます・・

  

   

2006/11/22 19:02:31
id:kn1967 No.4

回答回数2915ベストアンサー獲得回数301

ポイント100pt

何度もすみませんが、簡素なSQLから徐々に複雑にしていって、どこが悪いかを洗い出していきましょう。


(1)基本形、、、最後のセミコロンを忘れずに

SELECT 商品名

FROM テーブル1;

※テーブルが1個だけの時は テーブル1.商品名 という正式な書き方ではなくて省略可能。

※ここでエラーが出るようであればテーブル1が存在しないか、テーブル1に商品名というフィールドが無いということになります。


(2)テーブル1上のフィールドの値を表示

SELECT 商品名,JAN,在庫数

FROM テーブル1;

※ここでエラーが出るようであればJANあるいは在庫数というフィールドが存在していない。


(3)テーブル2を連結

SELECT テーブル1.商品名,テーブル1.JAN,テーブル1.在庫数

FROM テーブル1

LEFT JOIN テーブル2 ON テーブル1.商品名 = テーブル2.商品名;

※ここでエラーが出るようであればテーブル2が存在しないか、テーブル2に商品名というフィールドが存在していない。


(4)テーブル2のフィールドの中身も表示

SELECT テーブル1.商品名,テーブル1.JAN,テーブル1.在庫数 AS 当月在庫,Nz(テーブル2.在庫数,0) AS 前月在庫

FROM テーブル1

LEFT JOIN テーブル2 ON テーブル1.商品名 = テーブル2.商品名;

※ここでエラーが出るようであればテーブル2に在庫数というフィールドが存在していない。


(5)テーブル3を連結

SELECT テーブル1.商品名,テーブル1.JAN,テーブル1.在庫数 AS 当月在庫,Nz(テーブル2.在庫数,0) AS 前月在庫

FROM (テーブル1

LEFT JOIN テーブル2 ON テーブル1.商品名 = テーブル2.商品名)

LEFT JOIN テーブル3 ON テーブル1.商品名 = テーブル3.商品名;

※ここでエラーが出るようであればテーブル3が存在しないか、テーブル3に商品名というフィールドが存在していない。


(6)テーブル3のフィールドの中身も表示

SELECT テーブル1.商品名,テーブル1.JAN,テーブル1.在庫数 AS 当月在庫,Nz(テーブル2.在庫数,0) AS 前月在庫,Nz(テーブル3.在庫数,0) AS 前々月在庫

FROM (テーブル1

LEFT JOIN テーブル2 ON テーブル1.商品名 = テーブル2.商品名)

LEFT JOIN テーブル3 ON テーブル1.商品名 = テーブル3.商品名;

※ここでエラーが出るようであればテーブル3に在庫数というフィールドが存在していない。


(7)並び替え

SELECT テーブル1.商品名,テーブル1.JAN,テーブル1.在庫数 AS 当月在庫,Nz(テーブル2.在庫数,0) AS 前月在庫,Nz(テーブル3.在庫数,0) AS 前々月在庫

FROM (テーブル1

LEFT JOIN テーブル2 ON テーブル1.商品名 = テーブル2.商品名)

LEFT JOIN テーブル3 ON テーブル1.商品名 = テーブル3.商品名

ORDER BY テーブル1.商品名;


途中でエラーが出ても、まずは(1)~(7)まで順を追って行ってみてください。

id:hac20380

ありがとうございます!出来ました。

ただここからが本題といいますか、私のイメージを説明したいのですが、また次の質問でしたいと思いますので、一度この質問は終了したいと思います。本当にありがとうございました。

2006/11/24 14:30:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません