• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:条件付きでACCESSのデータを抽出したい)

条件付きでACCESSのデータを抽出する方法

このQ&Aのポイント
  • 条件付きでACCESSのデータを抽出する方法について教えてください。
  • 2分に1レコード生成されるmdbファイルがあり、排出数フィールドの値に応じてデータを抽出したいです。
  • Excel側に1度全部出力せずに、条件に合うレコードを直接抽出する方法があれば教えてください。

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

  • ベストアンサー
  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.6

No.2 です。 論理的な1日は 0700 から翌日の 0658 であるが ファイル は、実際の 1日(0000 ~ 2358) になっている、ということでしょうか? > 1日中排出数が0の場合201501070700のフィールドを表示したいのですが、 この条件では、さらに稀な不具合が出てきそうですね。 例えば、前日 2358 には 1以上で 当日は 1日中 0 の場合など。 仕様を詰めてから作成した方がよさそうですね。 といあえず、今回の 0700 を 引っ張るクエリを。 SELECT 日時, 排出数 FROM テーブル名 WHERE (排出数=0) AND (Nz(DLookUp("排出数","テーブル名","日時='" & DMax("日時","テーブル名","日時<'" & [日時] & "'") & "'"),DCount("*","テーブル名","排出数<>0"))<>0) UNION SELECT 日時, 排出数 FROM テーブル名 WHERE (日時 Like "*0700") AND (DCount("*","テーブル名","排出数<>0")=0);

Minsoi34
質問者

お礼

ありがとうございました、助かりました

その他の回答 (5)

回答No.5

<補足> 添付図のSQL文は SELECT 日時 FROM Test1 AS X WHERE Nz((SELECT Top 1 ・・・),1) > 0 And X.排出数=0; 示したSQL文と添付図とが一致していませんでしたので補足しておきます。

Minsoi34
質問者

お礼

補足していただき、ありがとうございます

回答No.4

【別解】教科書的な答え http://www.sql-reference.com/select/subquery.html SELECT 日時, 排出数 FROM Test1 AS X WHERE Nz((SELECT Top 1 排出数 FROM TEST1 WHERE 日時 < X.日時 ORDER BY 日時 DESC),1) > 0 And X.排出数=0; DBLookup()は、サブクエリの代用品として開発したものです。ですから、当然に、サブクエリでも書く事ができます。 ※安直に書けるならサブクエリでなくても良い! これは、あくまでも私の持論。時代と共に安直OKかなーと思っています。

Minsoi34
質問者

お礼

ありがとうございます、参考になりました。 紹介してもらったサイトの内容も分かりやすく勉強になりました

回答No.3

[訂正]先頭行の扱いについて。 ×先頭行=0は判断できない! 〇先頭行=0を判断するには・・・ DBLoookup(SQL文, 0)  ↓ DBLoookup(SQL文, 1) DBLookup()関数の(該当行なしの場合の)戻り値に0ではなく1以上を指定します。 ※ゲッ!ミスった!と思ったら、既に補足回答が・・・。 ※DBLookup()関数でしたら<戻り値に0ではなく1以上を>。

Minsoi34
質問者

お礼

ご丁寧に訂正までありがとうございます

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.2

「日時」フィールドはテキスト型であるものとします。 SELECT 日時, 排出数 FROM テーブル名 WHERE (排出数=0) AND Nz(DLookUp("排出数","テーブル名","日時='" & DMax("日時","テーブル名","日時<'" & [日時] & "'") & "'"),-1)<>0 最初のレコードが0の場合も抽出します。 最初のレコードが0の場合に抽出したくないなら 式の -1 を 0 に置き換えてください。

Minsoi34
質問者

お礼

ありがとうございます、望みの抽出結果になりました。 が、稀なケースで問題が生じるようになりました。 始めの情報不足だったのですが、この条件のmdbは1日に1ファイル作成しています。 2分に1レコード作成してるので1日に720レコード作製しています。 1日中排出数が0の場合、201501070000という形で0時0分の値が表示されています。 先頭レコードが7時なので、1日中排出数が0の場合201501070700のフィールドを表示したいのですが、無理でしょうか? 後出しで申し訳ないのですが、解決方法がありましたら教えて欲しいです。

回答No.1

SELECT Test1.日時, Test1.排出数 FROM Test1 WHERE ((((DBLookup("SELECT 排出数 FROM TEST1 WHERE 日時<'" & [日時] & "' ORDER BY 日時 DESC",0)>0) And ([排出数]=0))=True)); 【抽出条件】 1、直前の排出数が >0 or <>0。 2、自らの排出数が =0。 が成立すること。 ただし、最初のレコードが0の場合は抽出不可。なお、冒頭のSQL文では自作のユーザー関数 DBLookup()を利用しています。 Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function

Minsoi34
質問者

お礼

ありがとうございます、とても参考になりました。 正直少々複雑で分かりにくい部分がありましたが、後述の補足は分かりやすかったです。