- ベストアンサー
日別集計(その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の日時フィールドは時刻/日付 型なんですが、これをうまく使ってクエリをもう少し細か なものにしたいのです。 お知恵をお借りしたいと思います。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
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
その他の回答 (3)
> うわ~。。。ちょっと私のレベルだと解析に時間が > 掛かりそうですね。がんばってみます。 (1) 勤務帯(かな?)が日付をまたぐ場合、例えば、08:30 ~ 20:29:59 が早番なら、8.5時間減算した値が12:00以降か、11:59:59以前かで、早番/遅番を切り分ける。 (2) グループ化するには端数部分を切り捨てて、時刻が0:00、12:00のどちらかになるように加工する。 の2点がポイント。SQL一発で無理やり処理したため複雑化したが、設計、実装次第ではもっとわかりやすく単純化することも可能。 専門家のコメントがすでに付いているので、ドシロートのワタクシはここらで退散します。(おい
お礼
連絡が遅れてしまいましたが、、、出来ました! 今回は名無しさんの方法(#1)を参考にさせて頂き ました。本当にありがとうございました。 またよろしくお願いします!
補足
なるほど。。。お二方のご意見で少し、見えてきた 気がします。ほんとに詳しい解説まで入れて頂き、感謝 するばかりです。 結果はまた「お礼」欄で、ご報告致します。<お二方 ありがとうございます!
- 2ch
- ベストアンサー率51% (64/125)
むずい? RS.Open strSQL, cn ←レコードセット DO UNTIL RS.EOF DEBUG.PRINT RS("業務日付"),RS("番"),RS("カウント") RS.MOVENEXT LOOP でよいかと思うが、むずいだろうか? アクセスなら、クエリーを活用したら、いい感じで逝けるはずだが。 言えるのはこれだけだ。 うむ、がんばれ
お礼
連絡が遅くなりましたが無事できました! また辛口アドバイス、よろしくお願いします!(笑)
補足
難しいというよりは仮想テーブルという 考え方でやってみたことがなかったですから。。。 何度もありがとうございます。がんばります!
- 2ch
- ベストアンサー率51% (64/125)
環境を書くようになったみたいネ。高感度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句を記してもよい。
お礼
お久しぶりですね。 高感度10UP、大変うれしいです。 ちょっと複雑なようですし、今晩徹夜ですので(涙) 時間掛けて勉強させて頂こうかと思います。。。時間 はそんなにありませんが。。。^^; 詳しいご説明、ありがとうございます。^^
お礼
詳しいアドバイス、ありがとうございます。 うわ~。。。ちょっと私のレベルだと解析に時間が 掛かりそうですね。がんばってみます。 ありがとうございます。