• ベストアンサー

日別集計(その2)

DBはアクセス(.mdb)です。 現在のSQL構文ですが、、、 strSQL = "SELECT COUNT (*) From DB1 " strSQL = strSQL & "where 条件その1 = '" & Form1.Text1.Text & "' " strSQL = strSQL & "AND 条件その2 = '" & Form1.Text1.Text & "' " strSQL = strSQL & "AND 日時 BETWEEN #" & (開始日時を格納した変数) & "# AND #" & (終了日時を格納した変数) & "#" strSQL = strSQL & "GOROUP BY CDate(Fix(日時)) " rs.Open strSQL, cn SU = rs.Fields(0).Value という内容です。 これを実行すると”1日目”は取れるのですが、2日目 以降が取れません。単純に「SU = rs.Fields(0).Value」 ではなくWhile等でまわしてやればうまくいくでしょうか? それと、、、これは私も予想外だったのですが(汗)1日 を更に2分割(例:8:30~20:29までと20:30~8:29) しなければなりません。DBの日時フィールドは時刻/日付 型なんですが、これをうまく使ってクエリをもう少し細か なものにしたいのです。 お知恵をお借りしたいと思います。 よろしくお願いします。

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

  • ベストアンサー
noname#4564
noname#4564
回答No.1

strSQL = "SELECT" strSQL = strSQL & " Count(*) AS Kensu," strSQL = strSQL & " IIf(Hour(DateAdd("h", -8, DateAdd("n",-30, 日時)))>12,DateAdd("h",12,Fix(DateAdd("n",-30,DateAdd("h",-8,日時)))),Fix(DateAdd("n",-30,DateAdd("h",-8,日時)))) AS Jikantai" strSQL = strSQL & " FROM" strSQL = strSQL & "   DB1 " strSQL = strSQL & " WHERE" strSQL = strSQL & "     条件その1 = '" & Form1.Text1.Text & "' " strSQL = strSQL & "   AND" strSQL = strSQL & "     条件その2 = '" & Form1.Text1.Text & "' " strSQL = strSQL & "   AND" strSQL = strSQL & "     日時" strSQL = strSQL & "     BETWEEN #" & Format$(開始日時を格納した変数, "yyyy\/mm\/dd") & "#" strSQL = strSQL & "     AND #" & Format$(終了日時を格納した変数, "yyyy\/mm\/dd") & "#" strSQL = strSQL & " GROUP BY" strSQL = strSQL & "   IIf(Hour(DateAdd("h", -8, DateAdd("n",-30, 日時)))>12,DateAdd("h",12,Fix(DateAdd("n",-30,DateAdd("h",-8,日時)))),Fix(DateAdd("n",-30,DateAdd("h",-8,日時))))" strSQL = strSQL & " ORDER BY" strSQL = strSQL & "   IIf(Hour(DateAdd("h", -8, DateAdd("n",-30, 日時)))>12,DateAdd("h",12,Fix(DateAdd("n",-30,DateAdd("h",-8,日時)))),Fix(DateAdd("n",-30,DateAdd("h",-8,日時))))" With rs   .Open strSQL, cn   Do Until .EOF     Beep     If Hour(.Fields("Jikantai").Value) = 0 Then       Call MsgBox(Format$(.Fields("Jikantai").Value, "ggge年m月d日 早番") _ & " " & .Fields("Kensu").Value & "件", _ vbOkOnly, "確認")     Else       Call MsgBox(Format$(.Fields("Jikantai").Value, "ggge年m月d日 遅番") _ & " " & .Fields("Kensu").Value & "件", _ vbOkOnly, "確認")     End If     .MoveNext   Loop End With

siamzou
質問者

お礼

詳しいアドバイス、ありがとうございます。 うわ~。。。ちょっと私のレベルだと解析に時間が 掛かりそうですね。がんばってみます。 ありがとうございます。

その他の回答 (3)

noname#4564
noname#4564
回答No.4

  > うわ~。。。ちょっと私のレベルだと解析に時間が > 掛かりそうですね。がんばってみます。 (1) 勤務帯(かな?)が日付をまたぐ場合、例えば、08:30 ~ 20:29:59 が早番なら、8.5時間減算した値が12:00以降か、11:59:59以前かで、早番/遅番を切り分ける。 (2) グループ化するには端数部分を切り捨てて、時刻が0:00、12:00のどちらかになるように加工する。 の2点がポイント。SQL一発で無理やり処理したため複雑化したが、設計、実装次第ではもっとわかりやすく単純化することも可能。 専門家のコメントがすでに付いているので、ドシロートのワタクシはここらで退散します。(おい

siamzou
質問者

お礼

連絡が遅れてしまいましたが、、、出来ました! 今回は名無しさんの方法(#1)を参考にさせて頂き ました。本当にありがとうございました。 またよろしくお願いします!

siamzou
質問者

補足

なるほど。。。お二方のご意見で少し、見えてきた 気がします。ほんとに詳しい解説まで入れて頂き、感謝 するばかりです。 結果はまた「お礼」欄で、ご報告致します。<お二方 ありがとうございます!

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.3

むずい? RS.Open strSQL, cn ←レコードセット DO UNTIL RS.EOF  DEBUG.PRINT RS("業務日付"),RS("番"),RS("カウント")  RS.MOVENEXT LOOP でよいかと思うが、むずいだろうか? アクセスなら、クエリーを活用したら、いい感じで逝けるはずだが。 言えるのはこれだけだ。 うむ、がんばれ

siamzou
質問者

お礼

連絡が遅くなりましたが無事できました! また辛口アドバイス、よろしくお願いします!(笑)

siamzou
質問者

補足

難しいというよりは仮想テーブルという 考え方でやってみたことがなかったですから。。。 何度もありがとうございます。がんばります!

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.2

環境を書くようになったみたいネ。高感度10UP 機能分割した仮想テーブルを作成しながらまとめるとわかりやすい。 1.日時-8:30分した値を得るテーブル (処理ワーク) 2.[処理ワーク]テーブルから、午前・午後で切り分けるテーブル(まとめ) を作成すると、わかり易いと思う。 それで、原文がこんな感じ。 WHERE句については参照形式で、後記する。 SELECT   業務日付,番,COUNT(*) AS カウント FROM   (     SELECT       CDATE(FORMAT(仮日付,"YYYY\/MM\/DD\")) AS 業務日付,       IIF(HOUR(仮日付)<12,'早番','遅番') AS 番,       *     FROM       (         SELECT           CDate([日時]-CDate("8:30:00")) AS 仮日付,           *         FROM           DB1         (WHERE句・・・(1)参照)       ) 処理ワーク   ) まとめ (WHERE句・・・(2)参照) GROUP BY 業務日付,番 前にも言ったように、全角スペースを使用しているので注意 WHERE句について (1) 複雑な条件・件数が多くなりそうなら、この部分でWHERE句を使用するとよい。 あらかじめ絞る事で、スピードが増す。 (2) [業務上の日付][早番/遅番]で絞りたい、ここで制限するとわかり易い。 PGよりの考えではあるが、メンテをしやすい。 もちろん、(1)(2)の部分の両方にWHERE句を記してもよい。

siamzou
質問者

お礼

お久しぶりですね。 高感度10UP、大変うれしいです。 ちょっと複雑なようですし、今晩徹夜ですので(涙) 時間掛けて勉強させて頂こうかと思います。。。時間 はそんなにありませんが。。。^^; 詳しいご説明、ありがとうございます。^^

関連するQ&A