• ベストアンサー

抽出について

データベース列 社員ID , 氏名 , 講習番号 , 講習名 , 受講年月日 社員300人、講習番号30件くらいです。 このうち、講習番号05番の講習を受けてない人の一覧を表示、印刷したいのですが抽出しようと思い試行錯誤してチンプンカンプン状態です。 ご教授よろしくお願いします。

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

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

補足の件、了解しました。No2の方法でいいです。 No2にも書きましたように、 SELECT 社員ID, 氏名 FROM 講習履歴 AS Temp WHERE NOT EXISTS ( SELECT * FROM 講習履歴 WHERE 講習番号="05" AND 社員ID=Temp.社員ID ) GROUP BY Temp.社員ID, Temp.氏名; 上記をコピーし、新しいクエリデザインビューで開き、 SQLビューに切り替えて上記をコピーし、貼り付け、 適当な名前で保存してください。 なお、上記ではテーブルの名前が「講習履歴」となって いますが、当該のテーブルの名前がたとえば「テーブル1」 のような名前で保存されているならば、このSQL文の中の テーブル名を「テーブル1」のように書き変えます。たとえば、 SELECT 社員ID, 氏名 FROM テーブル1 AS Temp WHERE NOT EXISTS ( SELECT * FROM テーブル1 WHERE テーブル1="05" AND 社員ID=Temp.社員ID ) GROUP BY Temp.社員ID, Temp.氏名; のように、上記では3箇所変更しています。あるいは 当該のテーブル名「テーブル1」を「講習履歴」に変更 してそのままSQL文中のテーブル名を変更せずに そのままSQL文をコピーし、貼り付けるかです。 検索する講習番号は、 WHERE テーブル1="05" AND 社員ID=Temp.社員ID のところで、「05」と指定しています。「07」ならば、 WHERE テーブル1="07" AND 社員ID=Temp.社員ID とします。 あとは、任意に抽出する番号を指定する方法と レポートにする方法はNo2の通りです。 質問の場合はこのようなクエリを作成します。 集合でいえば「直積」という概念になります。 結構、理解が難しい部類に入ります。 クエリの使い方は分かると思うのですが、大丈夫 ですか? わからないところがあれば補足してください。

maripapa525
質問者

お礼

有難うございます 分かりました。月曜日、会社でやって見ます。 クエリ何とか分かります、トライします。

その他の回答 (3)

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

No2です。 一応、一つのテーブルに 社員ID , 氏名 , 講習番号 , 講習名 , 受講年月日 が、あるものとしています。 もし、社員一覧には社員IDが主キーで、 社員ID , 氏名 のようなものがあり、 講習履歴には、 社員ID , 講習番号 , 講習名 , 受講年月日 があり、それぞれ別テーブルになっているのら補足 してください。 なお、No1での講習履歴のテーブルの社員IDは 主キーではありません。つまり一人の社員が 複数の講習を受ける場合があり、講習履歴には 一人の社員が複数回出てくるものとしています。

maripapa525
質問者

お礼

有難う御座いました。 出来ました! SQLもっと勉強します。

maripapa525
質問者

補足

有難うございます。 全て同じテーブルです。 例えば、01番の社員は5件の講習を受講しているので、5行となっており、02番の社員は1件受講しているので、1行。 20件受講している社員は同じ社員番号で20行となっております。 拙い説明しか出来ずすみません。

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

(1) まず、クエリを作成します。 テーブルの名前を「講習履歴」とします。 以下のSQL文を新しいクエリをデザインビューで 開き、SQLビューにして、貼り付けます。 SELECT 社員ID, 氏名 FROM 講習履歴 AS Temp WHERE NOT EXISTS ( SELECT * FROM 講習履歴 WHERE 講習番号="05" AND 社員ID=Temp.社員ID ) GROUP BY Temp.社員ID, Temp.氏名; これだと、氏名もでますが、社員IDだけならば、 SELECT 社員ID, 氏名 のところを、 SELECT 社員ID としてください。 このクエリを適当な名前で保存します。 たとえば、「Qクエリ」とします。 (2) レポートはレポートの新規作成から 「オートレポート表形式」を選択し、 「基になるテーブルまたはクエリの選択」で (1)のクエリを選択し「OK」とすればレポートは 出来上がります。このレポートを適当な名前で 保存します。 なお、Accessでは(1)のSQL文は保存後はAccessの表現に 置き換えられますので、保存後にSQLビューでSQL文を 見ると違った表現になっています。 以上ですが、もし講習番号を任意に置き換えたいならば、 SQL文を以下で保存します。 SELECT 社員ID, 氏名 FROM 講習履歴 AS Temp WHERE NOT EXISTS ( SELECT * FROM 講習履歴 WHERE 講習番号=[検索条件] AND 社員ID=Temp.社員ID ) GROUP BY Temp.社員ID, Temp.氏名; 保存したクエリを開くと「検索条件」というパラメータが 表示されますので、たとえば「05」と入力すると「05」を 受講していない人の社員IDが表示されます。 同様にレポートを開くと同じようなパラメータが表示されます。 したがって任意に検索条件を設定してレポートを印刷する場合は かならずレポートを開いてから条件を入力して印刷してください。 以上です。わからないところがあれば補足してください。

  • okwavehide
  • ベストアンサー率12% (202/1650)
回答No.1

質問内容がチンプンカンプンです。 推察するにこんなことをしたいのでしょう。 (1)講習番号05番のある社員ID を抽出する (2)社員300人の一覧表から、上記(1)で抽出した社員を除く (3)上記で(2)の受講していなかった社員を一覧にして印刷する

maripapa525
質問者

お礼

Access初心者ですので、質問内容がおかしいのはご容赦下さい。 ほぼご回答頂いた通りです。 1,講習番号05の講習を受講していない社員IDを一覧抽出、印刷したいのです。

関連するQ&A