- ベストアンサー
SQLの質問です。
SQLの質問です。 Access2003でのデータ操作で、 (1)2つのテーブルから一部列でのデータ重複があるものを除き、全件抽出 (2)テーブルは dテーブル No、販売先、日時、評価、金額 mテーブル 販売先(主キー)、店舗名 この二つのテーブルから全データを出力、ただし同じNoが重複しているデータは評価がA~Dのもの中で(E~F、空もある)日時が最新のもののみ出力をしたいのですが、教えていただけませんでしょうか、お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1 再回答です。 御質問を読み直してみると、まだまだ不明な点が出てきてしまいました。 dテーブルには、 5つの項目があり 項目「No」は主キーではない(=重複がある) 条件=仕様としては、Noが重複する場合は、評価と日時で判断する・・・とのこと。 では、Noが重複しているレコードが有る場合、 「同じ評価と同じ(最新)日時」なのに、販売先が異なる場合は? 同様に、「同じ評価と同じ(最新)日時」なのに、金額が異なる場合は? dテーブルの「販売先」が、mテーブルの「販売先」(=販売先マスタ)というのは(説明が無いけど)推測出来ました。 ・・・が、dテーブルのデータ(=レコード)が「どのような条件で保存されているのか?」 全く不明なため、上に列挙したケースの扱いに関する「仕様」が、どうにも推測出来ませんでした。 このために(実は仕様に不明な部分が多々あるので)、他の回答者さんが現れていないのでは? と、(今更ながら)気づきました。 細かい「仕様」を御存知であるはずの質問者さんが、先の回答で参考URLを読み、御自分の努力で解決する方が「早い」と感じますが・・・いかがでしょうか? 御質問(丸投げ的な依頼)をするために必要な「まず提示すべき仕様」に不備がありすぎる気がします。 回答側でそれらを「いちいち」指摘してやり取りするより、参考資料を自分で学び、自己解決する方が「すぐ」に近い気がして仕方ないです。
その他の回答 (3)
- piroin654
- ベストアンサー率75% (692/917)
訂正です。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));
お礼
丁寧に教えてくださってありがとうございます! ベストアンサーにしたかったのですが、自分が至らない部分を指摘して頂いたので 今回はそちらをベストアンサーにしました。 大変感謝しております、ありがとうございます♪
- piroin654
- ベストアンサー率75% (692/917)
一案です。 提示されている条件のみで判断します。 当たり、ハズレのいずれかです。 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)
質問に記入された「条件」が矛盾しているようです。 また、不明な点も有ります。 >(1)重複があるものを除き ≠ >ただし同じNoが重複しているデータは・・・のみ出力をしたい 重複が発生しているデータについては、文末に記入された条件を満たすレコードを「除かない」ということでしょうか? また、同様に重複しているデータが、文末の条件を「満たさない」場合にはどう扱うのでしょうか? ぱっと読んで見ての疑問です。 補足すればもっと「仕様」が具体的になるので、回答が得やすくなるでしょう。 ちなみに、重複レコードを扱う過去の類似質問を、参考まで。 dテーブルとmテーブルのリレーションについては、同様に過去問検索で容易に解決できると思います。 直ぐに回答が欲しいとの事なら、御質問の内容であれば、過去問検索が一番早いとも思います。
補足
>重複が発生しているデータについては、...「除かない」ということでしょうか? そうです、重複データは評価のある最新日時のもののみ表示という意味です。 >同様に重複しているデータが、文末の条件を「満たさない」場合にはどう扱うのでしょうか? その場合は抽出しない考えでした。 わかりずらくてすいません;;
お礼
すいません、最初の要件の時点で勉強不足でした;; ご指摘受けたとおり少し自分で頑張ってみます!