- ベストアンサー
集計クエリでの抽出条件
アクセスのクロス集計で質問なのですが・・・ 日付ごとの集計を行いたいのですが日付が21日締めで行いたいのです。 フォームで年と月を入れるとその月の集計を行いたいのです。 (例:フォームの日付入力2008/01と入力→集計クエリで2007/12/21~2008/01/20までの集計) この場合、抽出条件はどのように行えばよいのでしょうか
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
日付から[月度]を求める式フィールドを作ります 月度: Format(DateAdd("m",-(Day([日付])>20),[日付]),"yyyy/mm") このフィールドに抽出条件を設定します フォームのテキストボックスに条件を入力するのなら =Forms!フォーム名!テキストボックス名 パラメータで条件を入力するのなら =[年月を入力してください] いずれの場合もクロス集計クエリのパラメータ指定で パラメータ名とデータ型を指定しておくことを忘れないでね
その他の回答 (3)
補足: GetDate関数とクロス集計クエリの書換えとの関係について Private Sub コマンド0_Click() Dim dbsCurrent As DAO.Database Dim qdfCrossSum As DAO.QueryDef Dim strSQL As String strSQL = "TRANSFORM Sum(tab1.数量) AS 数量の総計 " & _ "SELECT tab1.区分, Sum(tab1.数量) AS [合計 数量] " & _ "FROM tab1 " & _ "WHERE tab1.日付 BETWEEN #1/21/2008# AND #2/20/2008# " & _ "GROUP BY tab1.区分 " & _ "PIVOT tab1.日付;" Set dbsCurrent = CurrentDb Set qdfCrossSum = dbsCurrent.QueryDefs("tab1のクロス集計1") Debug.Print qdfCrossSum.SQL dbsCurrent.QueryDefs("tab1のクロス集計1").SQL = strSQL Debug.Print qdfCrossSum.SQL dbsCurrent.Close End Sub ちょっと、手法は旧い手法ですが、これで[tab1のクロス集計1]は更新されます。 "WHERE tab1.日付 BETWEEN #1/21/2008# AND #2/20/2008# " & _ を "WHERE tab1.日付 BETWEEN #" & Me.集計開始日 & "# AND #" & Me集計終了日 & "# " & _ とすれば、フォームのテキストボックスをクロス集計クエリに反映できます。 Me.集計開始日=GetDate(Me.年月, -1, 21) Me.集計終了日=GetDate(Me.年月, 0, 20) という仕掛けで getDate関数を用います。 ※断片的な回答でしたので一応補足した次第です。
tab1: ID__日付___________区分____数量 1___2007/12/20_____1_________1 2___2007/12/21_____2_________2 3___2008/01/19_____3_________3 4___2008/01/19_____3_________4 tab1のクロス集計クエリ1: 区分__合計_数量___2007/12/20___2007/12/21___2008/01/19 1__________________1__________________1 2__________________2____________________________________2 3__________________7________________________________________________________7 tab1のクロス集計クエリ2: 区分__合計_数量___2007/12/21___2008/01/19 2__________________2_________________2 3__________________7____________________________________7 TRANSFORM Sum(tab1.数量) AS 数量の総計 SELECT tab1.区分, Sum(tab1.数量) AS [合計 数量] FROM tab1 WHERE tab1.日付 BETWEEN #12/21/2007# AND #1/20/2008# GROUP BY tab1.区分 PIVOT tab1.日付; クロス集計クエリ1と2の差は WHERE 節の有無です。 さて、この WHERE節の生成要領ですが、私はクエリをVBAで編集しています。 ※クエリを編集する手段以外は勉強不足で知りません。
[イミディエイト] ? GetDate("2008/01/01", -1, 21) 2007/12/21 ? GetDate("2008/01/01", 0, 20) 2008/01/20 ここで、21と20を GetDate関数に埋め込むのは不味いでしょうね。 しかし、要は、集計開始日と集計終了日を求めなきゃ始まらないのではと思います。 Public Function GetDate(ByVal Now As Date, _ ByVal Move As Integer, _ ByVal Hiduke As Integer) As Date GetDate = DateSerial(DatePart("yyyy", Now), _ DatePart("m", Now) + Move - (Hiduke = 99), _ Hiduke * Abs(Hiduke <> 99)) End Function [イミディエイト] ? GetDate("2008/01/01", +1, 1) 2008/02/01 ? GetDate("2008/01/01", +1, 99) 2008/02/29 GetDate関数で翌月の1日と末日とを求めた例です。
お礼
早速の回答ありがとうございます。 こちらはクエリの中の抽出条件に入るのでしょうか・・・ SQLやVBを使用するのでしょうか? 初心者でちょっとわからないので・・
お礼
回答ありがとうございます。早速やってみたいと思います。