回答をいただいたのですが、全くの初心者で回答いただいた構文をどこで作ればいいのかさえわかりません。今の状況は新しいmdb.ファイルに上記で説明したテーブルが3つあるという状態です。Access2003です。不明な点だらけだとは思いますが、よろしくお願い致します。
http://q.hatena.ne.jp/1162269450 で回答いただいたSQL文はクエリに書き込みます。
新しいクエリを作ってSQLビューに切り替えます。
↓
その中に回答いただいたSQLを入力します。
↓
データシートビューに切り替えて望みの結果となっているかを確認します。
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ビューで開いた時に行が繋がったり[角括弧]がついていたり(括弧)が増えていても驚かないでください。
[角括弧]はフィールド名などに自動的に付加されますが、どのような基準で行を繋げたり(括弧)を付加しているのかは知らないです。
ありがとうございます。ただ、全くこのままコピペしたのですが、”SQLステートメントが正しくありません。'DELETE''INSERT''PROCEDURE''SELECT'または'UPDATE'を使用して下さい。とメッセージがでてしまいます・・
済みません。
SELECT と テーブル1.商品名 の間に空白が入ってなかったです。
SELECT テーブル1.商品名
今度はクエリ式 'テーブル1.商品名'の構文エラー :演算子がありません と出てしまいました。
恐らく一番上の部分だとおもわれます・・
何度もすみませんが、簡素な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)まで順を追って行ってみてください。
ありがとうございます!出来ました。
ただここからが本題といいますか、私のイメージを説明したいのですが、また次の質問でしたいと思いますので、一度この質問は終了したいと思います。本当にありがとうございました。
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行めがエラーとなりますというメッセージがでるのですが、どこがおかしいのでしょうか?