Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1724 / 2272 ツリー ←次へ | 前へ→

【5579】クエリで抽出 buti 05/7/8(金) 15:10 質問[未読]
【5580】Re:クエリで抽出 小僧 05/7/8(金) 15:58 回答[未読]
【5581】Re:クエリで抽出 buti 05/7/8(金) 16:46 質問[未読]
【5582】Re:クエリで抽出 buti 05/7/8(金) 17:01 発言[未読]
【5583】Re:クエリで抽出 小僧 05/7/8(金) 17:25 回答[未読]
【5584】Re:クエリで抽出 buti 05/7/8(金) 18:33 発言[未読]
【5585】Re:クエリで抽出 小僧 05/7/9(土) 0:20 回答[未読]
【5586】Re:クエリで抽出 buti 05/7/9(土) 11:33 お礼[未読]

【5579】クエリで抽出
質問  buti  - 05/7/8(金) 15:10 -

引用なし
パスワード
   こんにちは。

該当期間の対象者を抽出するためテーブルの取得日、喪失日を基にクエリを作りました。

取得日
起算取得日:IIf([取得日]>DateSerial(Year(DateAdd("m",-3,Now())),4,1),[取得日],DateSerial(Year(DateAdd("m",-3,Now())),4,1))

喪失日
起算喪失日:IIf([喪失日]<DateSerial(Year(DateAdd("m",9,Now())),3,31),[喪失日],DateSerial(Year(DateAdd("m",9,Now())),3,31))

加入月数: DateDiff("m",[起算取得日],[起算喪失日])+1

ここで加入月数が11ヶ月以下のものだけ抽出したいのですが、加入月数の抽出条件に、<12と入れてもパラメータが出てしまい抽出できません。

このクエリ(A)を基にクエリ(B)を作り、クエリ(B)で加入月数の抽出条件に、<12といれると抽出できるのですが、一つのクエリ(A)で抽出することは出来ないものなのでしょうか?

よろしくお願いします。

【5580】Re:クエリで抽出
回答  小僧  - 05/7/8(金) 15:58 -

引用なし
パスワード
   ▼buti さん:
こんにちは。
計算の速度までは考慮しておりませんが、とりあえずの解決方法を。

加入月数に使われていた「起算取得日」「起算喪失日」を
そのまま式にあてはめてあります。

加入月数:
DateDiff("m",IIf([取得日]>DateSerial(Year(DateAdd("m",-3,Now())),4,1),
[取得日],
DateSerial(Year(DateAdd("m",-3,Now())),4,1)),
IIf([喪失日]<DateSerial(Year(DateAdd("m",9,Now())),3,31),
[喪失日],
DateSerial(Year(DateAdd("m",9,Now())),3,31)))+1

これなら抽出条件を付けてもパラメータを聞かれないと思います。


-----(別方法)-------

クエリのSQLビューに下記SQLを貼り付けてみてください。
元テーブルは「T_buti」としております。

SELECT Q.取得日, Q.喪失日, Q.起算取得日, Q.起算喪失日,
DateDiff("m",[起算取得日],[起算喪失日])+1 AS 加入月数
FROM [
SELECT T_buti.取得日, T_buti.喪失日, IIf(Month(T_buti.取得日)>3,
T_buti.取得日,CDate(Year(取得日) & "/4/1")) AS 起算取得日,
IIf(T_buti.喪失日<DateSerial(Year(DateAdd("m",9,Now())),3,31),
T_buti.喪失日,
DateSerial(Year(DateAdd("m",9,Now())),3,31)) AS 起算喪失日
FROM T_buti
]. AS Q
WHERE (((DateDiff("m",[起算取得日],[起算喪失日])+1)<=11));

【5581】Re:クエリで抽出
質問  buti  - 05/7/8(金) 16:46 -

引用なし
パスワード
   ▼小僧 さん:
こんにちは。いつもありがとうございます。

元テーブルをコピーし、T_butiとしてSQLをそのまま貼り付けてみましたが、
「抽出条件でデータ型が一致しません」というエラーが出てしまいました。

ちなみに、取得日、喪失日とも日付・時刻型です。

よろしくお願いします。

【5582】Re:クエリで抽出
発言  buti  - 05/7/8(金) 17:01 -

引用なし
パスワード
   ▼小僧 さん:

すみません。言葉が足りませんでした。

>加入月数に使われていた「起算取得日」「起算喪失日」を
>そのまま式にあてはめてあります。

の方で解決は出来ました。ありがとうございます。

別方法がどんなものか見たかったので、試してみようとしたところエラーがでてしまったということです。

【5583】Re:クエリで抽出
回答  小僧  - 05/7/8(金) 17:25 -

引用なし
パスワード
   ▼buti さん:
こんにちは。

こちらでAccess97、Access2002で試してうまくいったのですが…。
「起算取得日」の計算を buti さんのものに戻して

SELECT Q.取得日, Q.喪失日, Q.起算取得日, Q.起算喪失日,
DateDiff("m",[起算取得日],[起算喪失日])+1 AS 加入月数
FROM [
SELECT T_buti.取得日, T_buti.喪失日,
IIf(T_buti.取得日>DateSerial(Year(DateAdd("m",-3,Now())),4,1),
T_buti.取得日,
DateSerial(Year(DateAdd("m",-3,Now())),4,1)) AS 起算取得日,
IIf(T_buti.喪失日<DateSerial(Year(DateAdd("m",9,Now())),3,31),
T_buti.喪失日,
DateSerial(Year(DateAdd("m",9,Now())),3,31)) AS 起算喪失日
FROM T_buti
]. AS Q
WHERE (((DateDiff("m",[起算取得日],[起算喪失日])+1)<=11));

これでどうでしょうか?

>このクエリ(A)を基にクエリ(B)を作り、
>クエリ(B)で加入月数の抽出条件に、<12といれる

という操作を一気に書いたのが上記SQLです。

【5584】Re:クエリで抽出
発言  buti  - 05/7/8(金) 18:33 -

引用なし
パスワード
   ▼小僧 さん:
こんにちは。

>こちらでAccess97、Access2002で試してうまくいったのですが…。

その後、関数の意味を調べて原因わかりました。
取得日不明のデータがあり取得日未入力のため、CDateの因数が有効でないためでした。
調べる前に返信してしまってすいません。

>これでどうでしょうか?

こちらは出来ました。ありがとうございます。

ところで最初に

>計算の速度までは考慮しておりませんが

とありましたが、

>>このクエリ(A)を基にクエリ(B)を作り、
>>クエリ(B)で加入月数の抽出条件に、<12といれる
>
>という操作を一気に書いたのが上記SQLです。

というやり方のほうが早いのでしょうか?
現在はそんなにデータが多くないので問題ないのですが今後の参考にと思いまして・・・

【5585】Re:クエリで抽出
回答  小僧  - 05/7/9(土) 0:20 -

引用なし
パスワード
   ▼buti さん:
こんばんは。

>>計算の速度までは考慮しておりませんが

例えば10万件のレコードがあったとすると、10万回 IIf の条件判断をする事になるので
時間がかかるかな?と思ったのですが、確信はありません。

またお持ちのPCの処理速度によっても変わってくると思います。

>現在はそんなにデータが多くないので
>というやり方のほうが早いのでしょうか?

正直なところ、やってみなければ解りません。
テストができる環境であるのでしたら、レコードが多くなっても
問題ない速度で処理できるかの検証をしてみてはいかがでしょうか?

現在あるデータを「コピー」「貼り付け」「コピー」「貼り付け」・・・

気のすむまでデータを増やしてクエリ実行!

体感できるほどの差がなければどちらでも良い事になります(笑)

【5586】Re:クエリで抽出
お礼  buti  - 05/7/9(土) 11:33 -

引用なし
パスワード
   ▼小僧 さん:
こんにちは。

>正直なところ、やってみなければ解りません。
>テストができる環境であるのでしたら、レコードが多くなっても
>問題ない速度で処理できるかの検証をしてみてはいかがでしょうか?
>
>体感できるほどの差がなければどちらでも良い事になります(笑)

10万件のデータでテストしてみました。
取得日、起算取得日、喪失日、起算喪失日、加入月数だけのクエリでは殆ど差がありませんでした。
実際のクエリはこの他にリレーションで結んであったり、他の演算処理をしているので10万件だと5秒位かかりました。
実際のクエリの方で
>>このクエリ(A)を基にクエリ(B)を作り、
>>クエリ(B)で加入月数の抽出条件に、<12といれる
とう方法のSQL文が作れていませんので試していませんが・・

小僧さん。色々ありがとうございました。
またよろしくお願いします。

1724 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078256
(SS)C-BOARD v3.8 is Free