• 締切済み

ACCESS2003でクエリの質問です

クエリを教えて下さい。 ACCESS2003でクエリを作成したいのですが テーブルに以下のようにデータが入っています。 ID   日付   項目あ 項目い 項目う 項目え 項目お 001 2009/08/27  A         B    C 001 2008/08/27  D    E         F    G 002 2009/08/27       H         I 002 2008/08/27  K    L         M 002 2007/08/27  K    L    O    M 同一IDで日付の新しいレコードを抽出するのですが、 もしNULLの項目があれば、日付の古いレコードから編集したいです。 結果としては以下のようなテーブルを作成したいです。 [002]の[項目お]の様に過去日付のものがNULLであれば編集はしません。 ID   日付   項目あ 項目い 項目う 項目え 項目お 001 2009/08/27  A    E    B    C    G 002 2009/08/27  K    H    O    I また以下のように過去日付のデータが異なる場合は 事前のチェックでエラーとして別テーブルに出すように考えていますが、 こちらも合わせて教えていただけると助かります。 ID   日付   項目あ 項目い 項目う 項目え 項目お 003 2009/08/27  N    O    P         Q 003 2009/08/27  N    O    P    R    Q 003 2009/08/27  N    O    P    S    Q SQLが苦手で困っています。 宜しくお願いします。

みんなの回答

noname#192382
noname#192382
回答No.1

エクセルではこの種の問題は楽と考えやってみました。このデータをエクセルにエクスポートし、データのないところには「ZZZ」を入れると、次のマクロで実行できました。計算結果は表の右側に出てきます。期日が同じときはdoubleddateのエラーメッセージが出てきます。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2009/8/27 ユーザー名 : ' Dim myid1 As String, myid2 As String, mydate1 As Date, mydate2 As Date, aa As String, bb As String, cc As String, dd As String, ee As String, mygyo As Integer, mygyo2 As Integer, myarray(8) As String, myclm As Integer, mymyclm As Integer, hajimegyo As Integer, zzz As String, mygyo3 As Integer, myid3 As Integer, mydate3 As String For mygyo = 2 To 9 myid1 = Cells(mygyo, 1) mydate1 = Cells(mygyo, 2) mygyo2 = mygyo + 1 myid2 = Cells(mygyo2, 1) mydate2 = Cells(mygyo2, 2) 'IDが同じか調査 If myid2 = myid1 Then hajimegyo = mygyo ' MsgBox (myid2) '期日が同じか調査 If mydate2 = mydate1 Then '期日が同じ MsgBox ("date doubled") MsgBox (mydate2) Else '期日が同じでない For myclm = 3 To 7 'データがZZZか調査 'MsgBox (Cells(mygyo, myclm)) If Cells(mygyo, myclm) = "zzz" Then 'データがZZZである myarray(myclm) = Cells(mygyo2, myclm) 'MsgBox (mygyo2) Else myarray(myclm) = Cells(mygyo, myclm) End If Next For myclm = 3 To 7 mymyclm = myclm + 7 Cells(mygyo, mymyclm) = myarray(myclm) Next End If Else End If '次のIDが同じか調査 mygyo3 = mygyo + 2 myid3 = Cells(mygyo3, 1) 'MsgBox (mygyo3) mydate3 = Cells(mygyo3, 2) If myid3 = myid1 Then '期日が同じか調査 If mydate3 = mydate1 Then '期日が同じ MsgBox ("date doubled") MsgBox (mydate3) Else '期日が同じでない For myclm = 3 To 7 'データがZZZか調査 mymyclm = myclm + 7 'MsgBox (Cells(mygyo, mymyclm)) If Cells(mygyo, mymyclm) = "zzz" Then 'データがZZZである myarray(myclm) = Cells(mygyo3, myclm) 'MsgBox (mygyo3) Else myarray(myclm) = Cells(mygyo, mymyclm) End If Next For myclm = 3 To 7 mymyclm = myclm + 7 Cells(mygyo, mymyclm) = myarray(myclm) Next End If End If 'MsgBox (myid1) Next ' End Sub

telele
質問者

お礼

ありがとうございます。 そうですね、エクセルで事前に処理するといった考えでも良いですね。 参考にさせていただきます。

関連するQ&A

  • アクセスのクエリーのことで教えてください

     テーブル1とテーブル2があってクエリーでリレーションシップを組むときに  結合プロパティを「テーブル1の全レコードと、テーブル2の同じ結合フィールドのレコードだけを含める。」にして表を作ろうとしたのですが、テーブル2に レコードが無い場合、テーブル1,2を使って作ったクエリー1で表を作り、 ビルドでクエリー1の項目を貼り付けて、計算させると、テーブル2にレコードが無いと空欄になっているためか、計算がうまく行きません。この問題を解決するにはどのような方法をとればよいですか? ほんとにこまったちゃんになっているので教えてください。 

  • Access重複クエリに関するご質問

    Access重複クエリを用いて、以下のような結果を出したいのですが 可能でしょうか? ご指導の程よろしくお願いいたします。 (例) <テーブル> ID 判定 日本語   英語 1   o   テスト   test 2 o    赤     red 3   x   油     apple 4   o    愛     love 5 x  りんご   apple 6   o  日本    Japan 7 o    テスト   test 8   o  りんご   apple 9   x   赤     blue 10   o  テスト   test <クエリ結果(1)> ・日本語重複、かつ、英語重複のレコードを、重複単位に並べ替えて抽出したい。 ※ID「3」の英語は重複しているが、日本語が重複していないので抽出しない。 ※ID「9」の日本語は重複しているが、英語が重複していないので抽出しない。 ID 判定 日本語   英語 1   o  テスト   test 7 o    テスト   test 10   o  テスト   test 5 x  りんご   apple 8   o  りんご   apple <クエリ結果(2)> ・クエリ結果(1)に加えて、判定が「o」、「x」どちらも含まれるレコードだけを抽出したい ※ID「1、7、10」は、判定がすべて「o」の為、抽出しない。 ID 判定 日本語   英語 5 x  りんご   apple 8   o  りんご   apple 以上ご教授の程よろしくお願いいたします。

  • Access  チェックリスト

    Access2016について質問です。 初心者です。 ILUOを作成して毎日の作業をチェックし評価しようと考えています。 [I] 指導を受けながら作業ができる [L] 1人で作業ができるが、指導を仰ぐ場合がある [U] 1人で作業ができる [O] 人に作業を指導できる 日付 [戻る] [次] [新規レコード] 項目名 I L U O 項目1 □ □ □ □ 項目2 □ □ □ □ 〃 〃 というようなフォームを作り新規レコードボタンを押すごとにチェックボタンがまっさらな状態で表示され、尚且つ戻るボタンで過去のチェックデータを見られるような形にしたいのですが どのように作ればいいのでしょうか? T項目 項目ID オートナンバー 項目名 テキスト I yes/no L 〃 U 〃 O 〃 T日付 日付ID オートナンバー 日付 日付/時刻 という二つのテーブルを作り試したのですが、そもそもテーブルの構成が正しいのかすらわかりません。 教えて頂けないでしょうかよろしくお願い致します。

  • Accessクエリ

    お世話になります。 Access初学者です。 グループごとに日付が最大のレコードを、それぞれ1件抽出するクエリを作成したいと思っています。 IDを表示させなければできるのですが、IDを表示させると全レコードが抽出されます。どのようにすればいいのでしょうか? よろしくお願いします。

  • クエリーの抽出条件について

    「作表条件」というフォームにテキストボックスとして「日付1」、「日付2」を設置しています。 元のテーブルには「日付」という項目があり、「日付1」から「日付2」までのデータを抽出するため、 クエリの条件式に Between Nz([Forms]![作表条件]![日付1],#1800/01/01#) And Nz([Forms]![作表条件]![日付2],#9999/12/31#) と記述しています。 ただ、元のテーブルの日付がNULL値の場合があり、その場合「日付1」および「日付2」が空欄だとNULL値のレコードが抽出されません。 「日付」がNULLの場合でも抽出できるようにするには、どのようにすればよいでしょうか? どなたか教えてください。

  • Accessクエリの抽出条件

    Access2000を使用しています。 クエリの抽出条件にテーブルの値を使用したいのですが、その方法がわかりません。 テーブルAには、「日付」、「当者コード」 などの項目があります。 テーブルBの項目は「担当者コード」のみです。また、1レコードしか登録 されていません(2レコード以上になることはありません)。 そこで、テーブルAに対するデータ抽出条件を、テーブルBの「担当者」としたいのですが、 どのように記述すればよろしいでしょうか・・・? よろしくお願いします。

  • Accessクエリ IIFについて

    お世話になります。 2つのテーブルをIDで紐付けて、それぞれの項目を比較し、○×を付けたいと思います。 【テーブルA】  ID メーカー 型番 品名 【テーブルB】  ID メーカー 型番 品名 【クエリC】  テーブルAとテーブルBをIDで紐付けて、各フィールド名を   テーブルAの方は前回_メーカー、前回_型番、前回_品名 とし、   テーブルBの方は今回_メーカー、今回_型番、今回_品名 とする。 【クエリD】  クエリCを元に、   前回_メーカー、前回_型番、前回_品名、今回_メーカー、今回_型番、今回_品名   を並べて表示し、それぞれを以下のように評価する。   メーカー評価:IIf([前回_メーカー]=[今回_メーカー],"○","×")   型番評価:IIf([前回_型番]=[今回_型番],"○","×")   品名評価:IIf([前回_品名]=[今回_品名],"○","×")   上記3つの評価でいずれかが×となっているレコードを抽出。 しかし、前回と今回でいずれも型番が空白(Null)だった場合、上記評価を すると"×"となってしまいました。 そこで質問ですが、   ・そもそもNull同士の評価は"×"になってしまうのでしょうか?(比較できない?)   ・テーブルAはSQL Server上にあり、テーブルBはExcelをインポートしたもの   (Accessのローカルテーブル)です。この違いによるものでしょうか。 ご教授の程、宜しくお願い致します。

  • 【Access】2つのクエリを1つにまとめる方法

    下記のT_Subテーブルでmain_idフィールド毎のdayフィールドの最大値のレコードを取得し、 取得したレコードの中でT_Mainのidフィールドに存在するもののみを表示したいと思い、 下記のQ_T_Sub_SelectクエリとQ_Ansクエリを作成し、 Q_Ansクエリを実行する事で意図した動作になったと思います。 その後、この2つのクエリを1つのクエリにまとめようと思ったのですが、 どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、 ご教示の程よろしくお願いします。 【Q_T_Sub_Selectクエリ】 SELECT T_Sub.* FROM T_Sub WHERE (((T_Sub.id)=(SELECT TOP 1 id FROM T_Sub Q WHERE Q.main_id = T_Sub.main_id ORDER BY day DESC, id DESC ))); 【Q_Ansクエリ】 SELECT T_Main.id, T_Main.field1, Q_T_Sub_Select.id, Q_T_Sub_Select.day, Q_T_Sub_Select.field2 FROM T_Main LEFT JOIN Q_T_Sub_Select ON T_Main.id = Q_T_Sub_Select.main_id; 【Q_Ansクエリの実行結果】 T_Main.id|field1|Q_T_Sub_Select.id|day|field2 1|A|2|     |2000 3|C|6|2011/03/10|200 【テーブル(T_Main)】 id|field1 1|A 3|C 【テーブル(T_Sub)】 id|main_id|day|field2 1|1|     |100 2|1|     |2000 3|2|2011/03/04|400 4|2|2011/03/03|500 5|3|2011/03/10|300 6|3|2011/03/10|200 なお、1つのクエリにまとめたい理由ですが、最終的にはクエリではなく、 Visual Basic上に記述を移植したいと思っているためです。 ちなみに、1つのクエリをVisual Basic上に移植して SQLの実行結果を利用するイメージは何となく分かるため、 2つのクエリを1つにまとめる方法を希望しましたが、 2つのSQL文があってもクエリなどを使用せず、 Visual Basic上への記述のみで動作する方法があれば、そのような方法でも大丈夫です。 以上、よろしくお願いします。

  • ACCESS クエリ(カウント0のレコードも表示させたい)

    すみません。クエリについて教えて下さい。 <生徒テーブル> 生徒ID・氏名 <出席テーブル> 生徒ID・日付 上記2のテーブルから、クエリで下記の情報を取り出したいのです。 <出席日数> 氏名・出席日数 <出席テーブル>には、1レコードもない生徒がいます。 この生徒は<出席日数>の出席日数を0として表示したいんです。 カウントを使って計算したところ、<出席テーブル>に1レコードもない生徒は表示できません。 説明がわかり難くて申し訳ないです。 どうぞ教えてください。

  • Access97の削除クエリーについて

    初歩的なことで もうしわけありません。チンプンカンプンです。 身の回りにある本で、削除クエリーすら捜すことが出来ませんでした。 教えてください。 宜しくお願いします。 Aテーブルから 以下の条件のレコードを削除したいです!! ※条件※ (Aテーブル.名前 = Bテーブル.名前 ) かつ、(Aテーブル.内訳 = NULL) レイアウト Aテーブル: 処理日付 → テキスト 8文字 名前 → テキスト 5文字 内訳 → テキスト 8文字 金額 → 通貨型 (テーブル数 60) などなど・・・ Bテーブル: 名前 → テキスト 5文字 で、こんな感じで 記述しました。 DELETE Aテーブル.内訳, Aテーブル.* FROM W_MB INNER JOIN Bテーブル ON Aテーブル.名前 = Bテーブル.名前 WHERE (((Aテーブル.内訳) Is Null)); すると こんなメッセージが→『更新可能なクエリーでなければなりません。』 な・なぜなのでしょう・・・