- ベストアンサー
条件付きでACCESSのデータを抽出する方法
- 条件付きでACCESSのデータを抽出する方法について教えてください。
- 2分に1レコード生成されるmdbファイルがあり、排出数フィールドの値に応じてデータを抽出したいです。
- Excel側に1度全部出力せずに、条件に合うレコードを直接抽出する方法があれば教えてください。
- みんなの回答 (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);
その他の回答 (5)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
<補足> 添付図のSQL文は SELECT 日時 FROM Test1 AS X WHERE Nz((SELECT Top 1 ・・・),1) > 0 And X.排出数=0; 示したSQL文と添付図とが一致していませんでしたので補足しておきます。
お礼
補足していただき、ありがとうございます
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【別解】教科書的な答え 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かなーと思っています。
お礼
ありがとうございます、参考になりました。 紹介してもらったサイトの内容も分かりやすく勉強になりました
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
[訂正]先頭行の扱いについて。 ×先頭行=0は判断できない! 〇先頭行=0を判断するには・・・ DBLoookup(SQL文, 0) ↓ DBLoookup(SQL文, 1) DBLookup()関数の(該当行なしの場合の)戻り値に0ではなく1以上を指定します。 ※ゲッ!ミスった!と思ったら、既に補足回答が・・・。 ※DBLookup()関数でしたら<戻り値に0ではなく1以上を>。
お礼
ご丁寧に訂正までありがとうございます
- m3_maki
- ベストアンサー率64% (296/460)
「日時」フィールドはテキスト型であるものとします。 SELECT 日時, 排出数 FROM テーブル名 WHERE (排出数=0) AND Nz(DLookUp("排出数","テーブル名","日時='" & DMax("日時","テーブル名","日時<'" & [日時] & "'") & "'"),-1)<>0 最初のレコードが0の場合も抽出します。 最初のレコードが0の場合に抽出したくないなら 式の -1 を 0 に置き換えてください。
お礼
ありがとうございます、望みの抽出結果になりました。 が、稀なケースで問題が生じるようになりました。 始めの情報不足だったのですが、この条件のmdbは1日に1ファイル作成しています。 2分に1レコード作成してるので1日に720レコード作製しています。 1日中排出数が0の場合、201501070000という形で0時0分の値が表示されています。 先頭レコードが7時なので、1日中排出数が0の場合201501070700のフィールドを表示したいのですが、無理でしょうか? 後出しで申し訳ないのですが、解決方法がありましたら教えて欲しいです。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
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
お礼
ありがとうございます、とても参考になりました。 正直少々複雑で分かりにくい部分がありましたが、後述の補足は分かりやすかったです。
お礼
ありがとうございました、助かりました