• ベストアンサー

日別集計(その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

  • 期間集計を日別集計にしたい

    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 #" & (終了日時を格納した変数) & "#" rs.Open strSQL, cn SU = rs.Fields(0).Value 上記のPGで変数「SU」に、SQL文で設定した条件に該当 するレコード数を代入していますが、これではあくまで 開始日時と終了日時の間に存在するトータルレコード数 、言わば「期間合計」になってしまいますよね。 現在行いたい内容ですが、開始日時と終了日時の間の日 付を1日ごとに分割し、その1日ごとでのレコード数が分 かる、「日別合計」処理をさせるようにしたいのですが。 やっぱり上記のSQL文を根本から考え直さないと出来ない でしょうか?出来れば、なるべく残しつつ、後の方で加工 できればいいなぁと思っているんですが。。。 よろしくお願いします。

  • NULL文字のINSERT

    こんにちは。 SQLServer初心者です。 Access VBAで SQLServerから抽出したデータをDBにINSERT しようとしてるのですが、抽出した項目にNULLデータがあるので エラーになってしまいます。 どのように回避すればよろしいでしょうか? ISNULL関数を使えば回避できるのでしょうか? たとえば以下のようなINSERT分を実行したいのですが、 顧客名_漢字のフィールドにはNULL文字が入ってる場合があるとします。 よろしくお願い致します。 strSQL2 = "" strSQL2 = strSQL2 & " INSERT INTO NORSE_TMP_DATA ( " strSQL2 = strSQL2 & " ポート名" strSQL2 = strSQL2 & ", 顧客名_漢字" strSQL2 = strSQL2 & ", 顧客名_カナ" strSQL2 = strSQL2 & ", 契約状態" strSQL2 = strSQL2 & ", 契約番号" strSQL2 = strSQL2 & ", 契約枝番号" strSQL2 = strSQL2 & ", 顧客番号" strSQL2 = strSQL2 & " VALUES (" strSQL2 = strSQL2 & " '" & rs.Fields("ポート名").Value & "'" strSQL2 = strSQL2 & ", '" & rs.Fields("顧客名_漢字").Value & "'" strSQL2 = strSQL2 & ",'" & rs.Fields("顧客名_カナ").Value & "'" strSQL2 = strSQL2 & ",'" & rs.Fields("契約状態").Value & "'" strSQL2 = strSQL2 & "," & rs.Fields("契約番号").Value strSQL2 = strSQL2 & "," & rs.Fields("契約枝番号").Value strSQL2 = strSQL2 & "," & rs.Fields("顧客番号").Value strSQL2 = strSQL2 & " )"

  • SELECT文の加工

    いつもお世話になります。 現在複数の条件でレコード数を割り出すPGを作成中なのですが、SELECT文の認識不足のため、みなさんに案を頂きたく思っている次第です。 現在までのコードですが。。。 変数 ASU strSQL = "SELECT COUNT (*) AS ASU From 入場者実績 where 姓 = '" & Form1.Text1.Text & "'" 'レコードセットをオープン rs.Open strSQL, cn ASU = rs.Fields(0).Value Form1.Text2.Text = ASU というところまでなのですが、実際にはもう少し、期間範囲を取り入れた条件で絞りたいんです。(DTPickerを2つ使用し、その間の期間に入場した同一性の数をカウント。) SELECT文にどのような追加をしたらよいでしょうか? みなさんよろしくお願いします!

  • Excel VBA EOFに関して

    テキストボックスにDateを入力し、SQLServerに接続しSelectの結果をシートに書き込むだけのものなのですが、「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています」というエラーでさっぱりわかりません。どなたかアドバイスをお願い致します。 -前後省略- stdate = UserForm1.stdate.Value endate = UserForm1.endate.Value strsql = "select ***" strsql = strsql & "from ***" strsql = strsql & "where *** and ***.start_date between '" & stdate & "' and '" & endate & "' " con.Open connectionString Set rs = con.Execute(strsql) Sheets("Data1").Select rs.MoveFirst i = 2 Do Until rs.EOF Cells(i, 1) = rs.Fields(0).Value Cells(i, 2) = rs.Fields(1).Value Cells(i, 3) = rs.Fields(2).Value Cells(i, 4) = rs.Fields(3).Value i = i + 1 rs.MoveNext Loop con.Close Set con = Nothing Exit Sub Err_DBConnectOpen: MsgBox Err.Description If con.State <> ADODB.adStateClosed Then con.Close End If Set con = Nothing End Sub

  • 日付期間の比較

    フォームから入力されたForm_timeに格納されている"900"という時間を表す値が、 DBデータの"900"という値と、"1000"という値の範囲に入るがどうかを判定して、 範囲内であればCheck_Flgという変数に1を格納、 範囲外であれば0を格納するよう処理を分岐したいのですが、肝心のIf条件内容を上手く書けないんです。 If (Cint(Form_time) = (Between rs("DB_STARTTIME") And rs("DB_ENDTIME"))) Then Check_Flg = 1 Else Check_Flg = 0 End If 「')' がありません。」と、コンパイルエラーが出てしまうんです... どうしたら、上手く判定出来るんでしょうか???

  • sqlで取得したデータを writelineメソッドでメモ帳に

    sqlで取得したデータを変数fffに fff=fff & rs.fields(0).value として格納しています これをWSHのwritelineメソッドでメモ帳に1データづつ改行したいのですが変数fffに入れてあるせいか横に羅列されてしまいます fff=fff & rs.fields(0).value & chr(13) でも駄目です。 どうすればいいか教えてください 

  • MovePrevious関数について

    いつもお世話になります。 表題の関数を使用したいのですが、「このコンテキストで操作は許可されていません。」というエラーが出てしまいます。 While文でまわしながら。。。 If (rs.Fields!お客様NO = Form1.Text2.Text _ And rs.Fields!ラインNO = Form1.Text1.Text) Then   Form1.Text5.Text = rs.Fields!受付NO rs.MovePrevious NUKE = rs.Fields!受付NO        ・        ・ と記述しています。 1つのお客様NOに対して、今回の受付番号と前回の受付番号を割り出すためにはMovePrevious関数をどのような使い方 をすればよろしいでしょうか? ご教授ください。よろしくお願いします。

  • チェックボックスとテキストの受け渡し

    やりたい事は20件位の表示の中から納品書を印刷する為に選択し数量変更をして 確認画面をだしたいのですが... チェックボックスのチェックされているデーター、テキストボックスのデーター 両方ともデーターを受け取る事はできたのですが、チェックボックスはチェックされているデーターだけで、テキストボックスは最初から、全く別のレコードのデーターが入ってしまいます。どうしたらチェックされたレコードのテキストを受け取れるか教えて下さい。 sentaku.asp <input type="checkbox" name="chk" value="<%=RS.fields("注文番号")%>"> <INPUT size="10" type="text" name="su" maxlength="10" value="<%=RS.fields("注文残")%>"> kakunin.asp <% For i = 1 To Request.Form("chk").Count chuno1 = Request.Form("chk")(i) nousu1 = Request.Form("su")(i) next %>

  • Visual Basic 2008 変数をDBへ登録するには?

    初歩的な質問ですいません。 AccessのDBへデータを登録したいのですが ラジオボタンの情報をどうやってうまく登録するか考えました。     Dim r as integer If RadioButton1.Checked = True Then r = 1        Else   RadioButton2.Checked = True r = 2 ここでラジオボタン1ならrに1を代入してちがうなら2を代入する データを追加 RS.AddNew() RS.Fields("a").Value = ComboBox1.Text RS.Fields("b").Value = ComboBox2.Text RS.Fields("c").Value = ComboBox3.Text RS.Fields("d").Value = r RS.Update() RS.Close() CN.Close() MsgBox("登録しました") End If この時、rの値をDBのdフィールドに登録したいのですが できません。 このRに入っている値を登録する方法を教えてください。 もっと簡単な方法があればそちらもご指導下さい。

  • AccessSQL COUNT文で該当レコード抽出したい

    初心者です。 Access2000であるテーブルの条件に一致した レコード件数を抽出するSQLを作成しました。 条件に該当しない場合も1件で件数が戻ってきてしまいます。 AccessクエリでSQLを貼り付けて 検証した場合はちゃんと0件になるのですが VBAのコードではうまく件数が抽出されません。 簡単なことだったらごめんなさい。 いろいろなサイトで探した末、 どうしても解決できないので ご教授よろしくお願いします。 Dim strSQL As String Dim db As DAO.Database Dim rs As DAO.Recordset  Dim IntCount As integer 'SQL文を生成 strSQL = "SELECT COUNT(*) AS 件数 FROM テーブル名 " strSQL = strSQL & "WHERE テーブル名.コード = '" strSQL = strSQL & Forms![フォーム名]![txtコード] strSQL = strSQL & "' AND Left([テーブル名]![区分],1) = '" strSQL = strSQL & Forms![フォーム名]![cnb種類].Column(0) strSQL = strSQL & "' AND テーブル名.名称 = '" strSQL = strSQL & Forms![フォーム名]![txt名称] strSQL = strSQL & "';" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) IntCount =  rs.RecordCount rs.Close Set db = Nothing Set rs = Nothing