• ベストアンサー

SQLの質問です。

SQLの質問です。 Access2003でのデータ操作で、 (1)2つのテーブルから一部列でのデータ重複があるものを除き、全件抽出 (2)テーブルは dテーブル No、販売先、日時、評価、金額 mテーブル 販売先(主キー)、店舗名 この二つのテーブルから全データを出力、ただし同じNoが重複しているデータは評価がA~Dのもの中で(E~F、空もある)日時が最新のもののみ出力をしたいのですが、教えていただけませんでしょうか、お願いします。

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

  • ベストアンサー
  • mhassy
  • ベストアンサー率43% (16/37)
回答No.2

#1 再回答です。 御質問を読み直してみると、まだまだ不明な点が出てきてしまいました。 dテーブルには、 5つの項目があり 項目「No」は主キーではない(=重複がある) 条件=仕様としては、Noが重複する場合は、評価と日時で判断する・・・とのこと。 では、Noが重複しているレコードが有る場合、 「同じ評価と同じ(最新)日時」なのに、販売先が異なる場合は? 同様に、「同じ評価と同じ(最新)日時」なのに、金額が異なる場合は? dテーブルの「販売先」が、mテーブルの「販売先」(=販売先マスタ)というのは(説明が無いけど)推測出来ました。 ・・・が、dテーブルのデータ(=レコード)が「どのような条件で保存されているのか?」 全く不明なため、上に列挙したケースの扱いに関する「仕様」が、どうにも推測出来ませんでした。 このために(実は仕様に不明な部分が多々あるので)、他の回答者さんが現れていないのでは? と、(今更ながら)気づきました。 細かい「仕様」を御存知であるはずの質問者さんが、先の回答で参考URLを読み、御自分の努力で解決する方が「早い」と感じますが・・・いかがでしょうか? 御質問(丸投げ的な依頼)をするために必要な「まず提示すべき仕様」に不備がありすぎる気がします。 回答側でそれらを「いちいち」指摘してやり取りするより、参考資料を自分で学び、自己解決する方が「すぐ」に近い気がして仕方ないです。

takeshi33
質問者

お礼

すいません、最初の要件の時点で勉強不足でした;; ご指摘受けたとおり少し自分で頑張ってみます!

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

訂正です。Q重複無しを訂正してください。 Q基礎.[No] を Q基礎.[No] AS Noの最大 とします。以下です。 Q重複無し: SELECT Q基礎.[No] AS Noの最大, Q基礎.販売先, Q基礎.店舗名, Q基礎.日時, Q基礎.評価, Q基礎.金額 FROM Q基礎 INNER JOIN dテーブル ON Q基礎.販売先 = dテーブル.販売先 GROUP BY Q基礎.[No], Q基礎.販売先, Q基礎.店舗名, Q基礎.日時, Q基礎.評価, Q基礎.金額 HAVING (((Count(*))=1));

takeshi33
質問者

お礼

 丁寧に教えてくださってありがとうございます! ベストアンサーにしたかったのですが、自分が至らない部分を指摘して頂いたので 今回はそちらをベストアンサーにしました。 大変感謝しております、ありがとうございます♪

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

一案です。 提示されている条件のみで判断します。 当たり、ハズレのいずれかです。 Noの条件で以下のように振り分けます。 (A)については(1),(2)の順番でデータを 抽出します。 (A) Noが重複したデータについて: (1) Noが重複したデータの抽出 評価がAからDのデータの抽出 (2) 日時が最新のものを抽出 (B) Noが重複していないデータについて: (1) Noが重複していないデータの抽出 (C) 該当データの抽出: (1) (A)と(B)を結合 順番にクエリを作成します。 以下のQ基礎、Q重複、Q重複絞込み、Q重複無し、Q総計、 のSQL文をそれぞれの名前で登録してください。SQL文の コピーはうまくできると思いますが、適度にエラーが出ないように 調整してください。 Q基礎: SELECT dテーブル.販売先, mテーブル.店舗名, dテーブル.[No], dテーブル.日時, dテーブル. 評価, dテーブル.金額 FROM mテーブル INNER JOIN dテーブル ON mテーブル.販売先 = dテーブル.販売先; Q重複: SELECT Q基礎.[No] AS Noの最大, Q基礎.販売先, Q基礎.店舗名, Q基礎.日時, Q基礎.評価, Q 基礎.金額 FROM Q基礎 INNER JOIN dテーブル ON Q基礎.販売先 = dテーブル.販売先 GROUP BY Q基礎.[No], Q基礎.販売先, Q基礎.店舗名, Q基礎.日時, Q基礎.評価, Q基礎.金額 HAVING (((Q基礎.評価)="A") AND ((Count(*))>1)) OR (((Q基礎.評価)="B")) OR (((Q基礎.評 価)="C")) OR (((Q基礎.評価)="D")); Q重複絞込み: SELECT Temp.[Noの最大] AS [No], Temp.販売先, Temp.店舗名, Temp.日時, Temp.評価, Temp.金額 FROM Q重複 AS Temp WHERE (((Temp.日時)=(SELECT Max(Q重複.日時) AS 日時の最大 FROM Q重複 GROUP BY Q重複.[Noの最大] HAVING (((Q重複.[Noの最大])=Temp.[Noの最大]))))); Q重複無し: SELECT Q基礎.[No], Q基礎.販売先, Q基礎.店舗名, Q基礎.日時, Q基礎.評価, Q基礎.金額 FROM Q基礎 INNER JOIN dテーブル ON Q基礎.販売先 = dテーブル.販売先 GROUP BY Q基礎.[No], Q基礎.販売先, Q基礎.店舗名, Q基礎.日時, Q基礎.評価, Q基礎.金額 HAVING (((Count(*))=1)); Q総計: SELECT Q重複絞込み.* FROM Q重複絞込み UNION SELECT Q重複無し.* FROM Q重複無し; Q総計で出てくるデータが意図したものか確認 してください。何か違っているような感じが しないでもないのですが、違っていたら ごめんです。

  • mhassy
  • ベストアンサー率43% (16/37)
回答No.1

質問に記入された「条件」が矛盾しているようです。 また、不明な点も有ります。 >(1)重複があるものを除き ≠ >ただし同じNoが重複しているデータは・・・のみ出力をしたい 重複が発生しているデータについては、文末に記入された条件を満たすレコードを「除かない」ということでしょうか? また、同様に重複しているデータが、文末の条件を「満たさない」場合にはどう扱うのでしょうか? ぱっと読んで見ての疑問です。 補足すればもっと「仕様」が具体的になるので、回答が得やすくなるでしょう。 ちなみに、重複レコードを扱う過去の類似質問を、参考まで。 dテーブルとmテーブルのリレーションについては、同様に過去問検索で容易に解決できると思います。 直ぐに回答が欲しいとの事なら、御質問の内容であれば、過去問検索が一番早いとも思います。

参考URL:
http://questionbox.jp.msn.com/qa5634616.html
takeshi33
質問者

補足

>重複が発生しているデータについては、...「除かない」ということでしょうか? そうです、重複データは評価のある最新日時のもののみ表示という意味です。 >同様に重複しているデータが、文末の条件を「満たさない」場合にはどう扱うのでしょうか? その場合は抽出しない考えでした。 わかりずらくてすいません;;

関連するQ&A

  • SQL SERVER 店舗毎のTOP10

    表題の件のSQLについてアドバイスお願いいたします。 DB:SQL SERVER 2008 R2 テーブル:売上伝票 カラム 店舗|伝票No|伝票日付|商品CD|商品名|数量|単価|金額(数量x単価) SELECT TOP 10 店舗NO, 商品CD, 商品名, SUM(数量) AS 販売数, SUM(金額)AS 販売金額 FROM 売上伝票 WHERE 伝票日付 BETWEEN [開始日] AND [終了日] GROUP BY 店舗NO,商品CD,商品名, ORDER BY 店舗NO,販売金額 DESC 当然ですが、上記のSQLでは、一番若い店舗NOのトップ10しか抽出できません。 店舗別、販売金額のトップ10を抽出するための、SQL文についてお教えください。

  • VB SQL文について

    VB6.0(SP5) XP SQL Sever7.0を使用しています。 テーブルからSQLより以下の条件で抽出しようとしています がいいSQL文が浮かびません。 TableA ----------------------- | sDate | nNumber | ----------------------- | 20030301 | 200 | | 20030301 | 250 | | 20030302 | 220 | | 20030302 | 225 | | 20030303 | 230 | ----------------------- 上記の内容で、一度読み込んで、内部テーブルに格納 したとします。TableAにデータ6、7が追加後に再度、 TableAを読んだときにデータ6、7だけ抽出したいのです が、いい方法ありますか? TableA ----------------------- | sDate | nNumber | ----------------------- | 20030301 | 200 | 1 | 20030301 | 250 | 2 | 20030302 | 220 | 3 | 20030302 | 225 | 4 | 20030303 | 230 | 5 | 20030303 | 240 | 6  ← 抽出したいデータ | 20030304 | 100 | 7  ← 抽出したいデータ ----------------------- ルール sDate :重複することあるが昇順になっている。 nNumber:sDateをキーにすると重複しない。 sDate+nNumberでみると昇順になっている。 よろしくお願いします。

  • SQLアドバイスください。

    テーブルA 項目名:ID(Key シーケンシャルカウント)、顧客ID(KEY)、管理NO、金額 (1) 01 0001 A001  5000 (2) 02 0001 A001 10000 (3) 03 0001 A001 10000 (4) 04 0001 A001 2000 (5) 05 0002 A001 4000 (6) 06 0003 A001 3000 (7) 07 0003 A001 3000 こういう状態のテーブルがあります。 (更新処理上で重複データが出来てしまいました) やりたい事はこの重複データが何件あるか?そしてその修正ですが、 (2)(3)と(6)(7)は重複です。抽出条件はなくただ前と同じデータが次のレコードに作成されたという事 この場合の重複データ件数は、2件になります。 修正後のテーブルはこうなりたいです。 (1) 01 0001 A001  5000 (2) 02 0001 A001 10000 (4) 04 0001 A001 2000 (5) 05 0002 A001 4000 (6) 06 0003 A001 3000 重複データが何件あるか?そしてその修正方法ですが、 PL/SQLを使用しないで出来ますか? やりかたを教えてください。

  • SQLを教えてください!!

    テーブルAとテーブルBがあり、両方に存在しないものを抽出してエラーとする処理を行いたいのですが、 どういうSQlを書いたらいいのか教えてください。 下記例としてテーブルにデータがあったとしたら、結果として 004 商品D 005 商品E 006 商品G というデータを抽出したいのですが・・ テーブルA             テーブルB -------------        ----------------------- コード  商品名 NO コード   商品名 001 商品A        1 001 商品A 002 商品B        2 001  商品A 003 商品C        3 002   商品B 004 商品D        4 003 商品C 006 商品G        5 003 商品C                 6 005 商品E

  • SQLの書き方について

    以下の様なデータある場合 【Aテーブル】 ------------- NO,ITEM, KOSU ------------- 1 ,001 , 1 2 ,002 , 3 3 ,003 , 1 【Bテーブル】 ------------------- NO,NENDO,CODE,BIKO ------------------- 1,2006 , 1 , 1111 1,2007 , 0 , 1111 1,2007 , 2 , 1111 2,2007 , 0 , 2222 3,2007 , 0 , 3333 3,2007 , 1 , 3333 ------------------------------ NO,NENDO,CODE,BIKO,ITEM,KOSU ------------------------------ 1,2007 , 0 , 1111,001 , 1 2,2007 , 0 , 2222,002 , 3 3,2007 , 0 , 3333,003 , 1 と出力。(キーはNo) NO毎のかつ年度の降順、コードの昇順で最新の1件を 取得するにはどのようなSQLを作成したらよいのでしょうか?

  • ACCSESSのSQLで教えてください。

    すみません! SQL初心者なのですが教えてください。 下記のようなtableというテーブルなのですが こちらのテーブルをデータが増加しても(1)から(2)のように select表示させるにはどうすればよいか教えて頂けないでしょうか・・・。 何卒よろしくお願い致します。 テーブル名:table カラム名:NO,kigou (1) table |NO|kigou| |1 |a | |2 |b | |3 |c | |4 |d | |5 |e | ↓ (2) |NO1|kigou1|NO2|kigou2|NO3|kigou3| |1 |a |2 |b |3 |c | |4 |d |5 |e | ・・・

  • sql文のwhere句について

    <環境>sqlserver SQLでパラメータが空白であれば全件取得、パラメータに値が設定されている場合には 条件にHITするデータを抽出したいのですが、一本のクエリで抽出することができるのでしょうか? 空白時パラメータは以下のとおり入ってきます。 @no="" …完全一致 @name="%%" …部分一致 例) SELECT * FROM テーブル WHERE (NO = @no) and ((@name IS NULL) OR (@name IS NOT NULL) AND (NAME LIKE @name)) NAMEは上記クエリにて取得できています。 NOのところはどのようにすればよいでしょうか?

  • ACCESSクエリでの結合の仕方・・・SQL文かも

    ACCESS 2003を使用しています。 テーブルA テーブルB の2テーブルでクエリを作っています。 結合的には・・・ テーブルAのフィールドX ⇔ テーブルBのフィールドY です。 これで2テーブルに共通する一致データのみ抽出はできるのですが、 2テーブルに共通する一致データに加えて、 2テーブルの不一致データも一緒にクエリ表示されるようにしたいのです。 欲しいのは抽出イメージは、以下のような感じのクエリ結果です。 テーブルA:フィールドX|テーブルBのフィールドY a             |(空) (空)           |b c             |c d             |(空) (空)           |e f              |f  g             |(空) h             |h おそらく、SQL文を書く必要があるとは、想像できるのですが・・・ どなたか、ご教授いただけると助かります。 よろしくお願いします。

  • SQLの構文で質問です。

    いつもお世話になっております。 SQLの構文で質問です。 テーブルを開いて、データの中から日付を絞って抽出したいのですが、 whereの後にどのような記述をすればいいのかわかりません。 なんとなく『>』を使ってやってみましたがうまく抽出できませんでした。 例えば、2008/12/01~2008/12/31の絞りで抽出できるようにしたいのですが。 SELECT * FROM 日付 WHERE (日付   2008 / 12 / 01    2008 / 12 / 31) すみません、SQLを使い始めて間もなく本を見てはいるのですがうまくいかないもので。 宜しくお願いします。

  • SQL文が上手く記述できません・・。

    <<テーブル名:master>> SHOUHIN NO  KOSU ------- --- --------------- A       1   500 A       2   100 A       2   300 A       2   200 A       3   220 A       3   150 A       4   200 A       4   300 A       4   100 <<抽出結果>> SHOUHIN    NO1    NO2    NO3    NO4    GOUKEI -------    ---    ---    ---    ---    ------ A        500    600    370    600    2070 上記のmasterテーブルから、NO毎にKOSUの値を集計して 1レコードにまとめて下記の抽出結果のようにデータを抽出したいと 考えているのですが、なかなか上手くSQLを記述する事が出来ません・・・。 下記のような結果を抽出することは可能でしょうか? ご存知の方がいらっしゃれば、ご教授頂ければ幸いです。 宜しくお願い致します。