Access2003で前日の売上金データを取得する方法

このQ&Aのポイント
  • Access2003を使用してカレンダーリストの作成を行っています。カレンダーには年月日、売上金などの項目があります。目的は「前日売上金」に、1レコード前もしくは前日以前のレコードの「売上金」データを格納することです。前日の売上金が0円だった場合は、最後の営業日の売上金データがあったものを取得したいと考えています。
  • SQLクエリの例として、以下のような組み合わせを試してみましたが、前日以前のデータを抽出する方法が分かりません。SELECT t1.年月日, t1.売上金, t2.年月日, t2.売上金 AS 前日売上金 FROM Tカレンダ AS t1 LEFT JOIN Tカレンダ AS t2 ON t2.年月日 = DateAdd("d",-1, t1.年月日) ORDER BY t1.年月日;
  • お手数ですが、前日以前のデータを抽出する方法を教えていただけないでしょうか。
回答を見る
  • ベストアンサー

Access 1レコード前の情報を取得

Access2003でSQLクエリを用い、カレンダーリスト(テーブル名:T_カレンダー)の作成をしております。 カレンダーには、年月日、売上金、前日売上金、などの項目があります。 Tカレンダテーブルの内容 年月日 売上金 ■目的 「前日売上金」 に、 1レコード前、もしくは前日以前のレコード(※)の 「売上金」 のデータを格納したい。 ※前日以前のレコードとしたいのは  カレンダーですので、年月日も営業日などの関係で、  土日のデータなどは0円になることがあります。 (ちなみにデータ値がない場合は0を既定値でセット) その為、前日の売上金が0円だった場合、 最後の営業日の売上金データがあったもの(0円以外のもの)を持って来たいと考えています(※2)。 基本、+(プラス)値となりますが、-(マイナス)値も抽出したいと考えています。 ■ためしに SELECT t1.年月日, t1.売上金, t2.年月日, t2.売上金 AS 前日売上金 FROM Tカレンダ AS t1 LEFT JOIN Tカレンダ AS t2 ON t2.年月日 = DateAdd("d",-1, t1.年月日) ORDER BY t1.年月日; こんなSQLを組んでみました。1日前のデータは抽出できたのですが ※2の内容がどう組んでよいか、わかりません。 どうか、ご教授願います。 宜しくお願いいたします。

  • -0-y
  • お礼率75% (59/78)

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

あっさりと以下の方法ではどうですか。 (1) 標準モジュールに以下のコードを貼り付け保存します。 DAOを使っているので参照設定で、 Microsoft DAO xx Object Libraryにチェックを入れてください。 AADoがチェック済みならばADOより上に設定しておいてください。 Function funcDate(ByVal ddd As Date) As Date Dim db As Database Dim rs As Recordset Dim i As Long Dim Maxnum As Date Dim Minnum As Date Dim num As Long Set db = CurrentDb Set rs = db.OpenRecordset("Tカレンダ") Maxnum = DMax("年月日", "Tカレンダ") Minnum = DMin("年月日", "Tカレンダ") num = DateDiff("d", Minnum, Maxnum) For i = 1 To num - 1 If rs.RecordCount > 0 Then rs.MoveFirst Do Until rs.EOF If rs!年月日 = ddd - i Then If rs!売上金 > 0 Then funcDate = rs!年月日 Exit For End If End If rs.MoveNext Loop End If Next i rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Function (2) 以下のSQLを新しいクエリのSQLビューに貼り付け 保存します。 SELECT t1.年月日, t1.売上金, funcDate(t1.年月日) AS 前営業日, t2.売上金 AS 前営業日売上金 FROM Tカレンダ AS t1 LEFT JOIN Tカレンダ AS t2 ON t2.年月日=funcDate(t1.年月日) ORDER BY t1.年月日; 一番ふるい日付の前日はレコードがないので、 0:00:00になり、前営業日売上金はNullになります。 以下のようにすれば体裁整いますが、 あまり意味がないかもしれません。 SELECT t1.年月日, t1.売上金, IIf(IsNull(前営業日売上金),Null,funcDate(t1.年月日)) AS 前営業日, t2.売上金 AS 前営業日売上金 FROM Tカレンダ AS t1 LEFT JOIN Tカレンダ AS t2 ON t2.年月日=funcDate(t1.年月日) ORDER BY t1.年月日;

-0-y
質問者

お礼

助かりました。ありがとうございます。

-0-y
質問者

補足

丁寧なご回答ありがとうございます。 早速、試させていただいてみたところ、 望みどおりの結果が算出されました。 あとは、この他に別の計算処理も組み込まなければいけないのですが、 多少パフォーマンスが心配ですが、後は自力で頑張ってみます。

その他の回答 (1)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

SELECT t1.年月日, t1.売上金, t2.年月日, t2.売上金 AS 前日売上金 FROM Tカレンダ AS t1 LEFT JOIN Tカレンダ AS t2 ON t2.年月日 = (SELECT MAX(t3.年月日) from Tカレンダ AS t2 where t3.年月日 < t1.年月日 and t3.売上金 > 0) ORDER BY t1.年月日; という方法を使います。 (accessでは未確認。)

-0-y
質問者

補足

ありがとうございます。回答感謝しております。 クエリ式't2.年月日 =(SELECT(SELECT MAX(t3.年月日) from Tカレンダ AS t2 where t3.年月日 < t1.年月日'の構文へラー となってしまいました。 因みにON区の部分のSELECT文内の、Tカレンダ AS t2となっていた箇所は t2→t3 という事でよいでしょうか? =(SELECT(SELECT MAX(t3.年月日) from Tカレンダ AS t3 where t3.年月日 < t1.年月日' 取得条件は判ってきたのですが、 構文エラーから脱出できません(汗 もし、他の構文の書き方などご存知でしたら ご教授いただけますでしょうか?

関連するQ&A

  • アクセスのレコードが計算されない・・・・

    windows2000/Access2000 レンタカーというテーブルがあって、そこから売上年が2003年、売上月が2月のデーターをフォームフィルタで検索かけてレコードを抽出し、エクセルにOfficelinksを使って出力しました。 SUMを使って請求書計の合計を計算させようとしましたが、計算されず0になってしまいます。 フォームフィルターなど検索かけずに全てレコードを出力した場合は計算されるのですが・・・? フィルターを使って検索抽出したデーターはエクセルに出力して計算させる事って出来ないのでしょうか?

  • SQL文 特定のレコードを抽出したい

    以下のようなテーブルAがあったとします。 年月日,項目B ---------------------- 20080101 100 20080102 100 20080103 200 20080104 400 20080105 400 20080106 200 SQL文にて、データの抽出を行いたいのですが、 抽出したいのは、データに変更があった年月日と項目Bの値です。 年月日,項目B ---------------------- 20080101 100 20080103 200 20080104 400 20080106 200 前の年月日と比較し、項目Bに違いがあった場合のデータだけ抽出したいのですが、SQL文で行うことは可能でしょうか?? 環境は、SQL Server 2005 です。

  • ACCESS SQL 括弧について

    AS 売上の合計をAS 07売上の合計に変えたところ かっこの使い方が正しくないと言われました。 ASの名前を変えただけなのですが、何が問題なのでしょうか? SELECT IIf([07売上の合計]=[売上],"●","×") AS 比較 FROM [SELECT ■T_M店マスタ.企業コード, ■T_M店マスタ.データレベル, Sum(■売上三期.[07年_売上]) AS 07売上の合計 FROM ■T_M店マスタ INNER JOIN ■売上三期 ON ■T_M店マスタ.店コード = ■売上三期.店コード GROUP BY ■T_M店マスタ.企業コード, ■T_M店マスタ.データレベル HAVING (((■T_M店マスタ.データレベル)="10"))]. AS 店 INNER JOIN [SELECT [●T_K調査データ(売上)企業レベル(単独店込み)].企業コード, [●T_K調査データ(売上)企業レベル(単独店込み)].売上, Format(DateAdd("m",-6,CDate("H" & Left([決算期],2) & "年" & Right([決算期],2) & "月")),"yyyy" & "年") AS 式1 FROM [●T_K調査データ(売上)企業レベル(単独店込み)] WHERE (((Format(DateAdd("m",-6,CDate("H" & Left([決算期],2) & "年" & Right([決算期],2) & "月")),"yyyy" & "年"))="2007年"))]. AS 企業 ON 店.企業コード = 企業.企業コード WHERE (((IIf([07売上の合計]=[売上],"●","×"))="×"));

  • 非営業日のレコードを前営業日のレコードを元に補う

    営業日のみデータが入力されているテーブルを元に 非営業日(土日祝祭日など)のレコードを前営業日の レコードを参照して補いたいと考えています。 例) 主キーがDT,NMのテーブルT1 に営業日のみデータが入力されている DT NM FEE ========== 4/1 A 3 4/1 B 5 4/4 A 9 4/4 B 10 ↓ これをもとに、非営業日分(4/2,4/3)のレコードを 前(直近)営業日のデータで補った結果を作成したい。 Q1 DT NM FEE REF ========== 4/1 A 3 4/1 B 5 4/2 A 3 4/1 ←前営業日のレコードをもとに生成 4/2 B 5 4/1 ←前営業日のレコードをもとに生成 4/3 A 3 4/1 ←前営業日のレコードをもとに生成 4/3 B 5 4/1 ←前営業日のレコードをもとに生成 4/4 A 9 4/4 B 10 ちなみに列REFは何日のデータを参照して レコードが生成されたかを表示する列です。 営業日にフラグを立てたカレンダーテーブルと結合 させてみたりしたのですが、どうもうまくいきません。 環境はACCESSです。 わかりにくい説明で申し訳ありませんが、 よろしくお願いいたします。

  • Access クエリでレコードセット作成

    Access2010でVBAを勉強しています。クエリオブジェクトからレコードセットを作れるかお教えください。 クエリのデザイン作成で3つのテーブルからデータを抽出するクエリを作りました。 このクエリオブジェクトからレコードセットを作りたいと思っていますが、作り方がわかりません。 よってクエリオブジェクトのSQLビューでSQLを確認し、VBAの中で下記のようにSQLを作ってレコードセットを作っています。 これだと効率が悪いので、クエリオブジェクトから直接レコードセットがつくれないかと思っています。 方法がありましたらお教え下さい。よろしくお願いします。 strSQL = "SELECT master.[サイズ], master.単価," strSQL = strSQL & "Nz([入庫数量の合計])-Nz([出庫数量の合計]) AS 在庫数" strSQL = strSQL & " FROM (master LEFT JOIN Q_出庫 ON master.[サイズ] = Q_出庫.[サイズ])" strSQL = strSQL & " LEFT JOIN Q_入庫 ON master.[サイズ] = Q_入庫.[サイズ]" objADORS.Open "T_出庫", objADOCON, adOpenDynamic, adLockOptimistic

  • 検索するレコードの件数について

    こんにちわ。 ハントと申します。 SQLで検索するレコードの件数について アドバイスを頂きたいのでよろしくお願い致します。 (質問内容) 検索するレコードが100件あるとします。 この内、50件を検索したいのですが、 うまく抽出できるSQLが思い当たりません。 (ROWNUMを使えばよいと思いましたが、ROWNUMが振られるのは ORDER BY の前であるので、  ORDER BYをした後に順番を振りたいのです。) どのようにSQLを組んだら抽出できるのかアドバイスをよろしくお願い致します。

  • updateについて(SQL)

    こんばんわ。現在、oracle8i,SQLを勉強中で基本的な事はできるようになったのですが、わからない所が出てきたのでよろしくお願いします。 売上票 年月日 当日売上 前日売上 ------------------------ 2000/04/11 100 2000/04/10 150 2000/04/09 90 2000/04/08 120 このようなテーブルがある時に前日売上に一つ前のレコードの当日売上の値を更新したいのですが、そのような事をSQL文(1文)で実現することはできるのでしょうか?updateするときに一つ前のレコードの値を取得することは出来るのでしょうか?いろいろとサイトを回って探してみたのですが、該当レコードの値を操作するものはみつかったのですが、他のレコードを操作するものは見つかりませんでした。 よろしくお願いします。見当違いな質問でしたらお許し下さい。

  • Access2000の件です。

    OSがWIN98で、Access2000をやってます。 1)カレンダーコントロールで選択した日付のデータを、 2)テーブルから抜き出して、サブフォームで表示し、 3)コマンドボタンで新しいレコードの追加を行い、 4)追加したレコードに、年月日+通し番号の識別IDのみを   デフォルトで与え、その通し番号を、テキストBoxに、   表示させようとしています。 私なりの作業 1)カレンダーにクリック時のイベントが無かったので、   年月日という名のテーブルに、現在選択されている   日付を代入するマクロを、コマンドボタンのイベントにしました。 2)クエリを作り、抽出条件に   ≪[年月日]![年月日]≫が日付と等しい、にしたフォームを   作り、サブフォームに設定しました。 ところが、この時点で、サブフォームに検索されません。 前回終了時に年月日テーブルに保存された日付でしか、 検索されません。 いろいろ考えてましたので、各コントロールの設定も、 かなりいじってます。 ひょっとしたら簡単なことなのかも、しれません。 が、煮詰まってしまってますので、考え付きません。 どうか、助けてください。

  • オラクルのデータをAccessに追加 無限ループ

    前回、オラクルからデータを取り出し、Accessのテーブルに書き込みを教えて頂き、データ追加は出来たのですが、データ追加時に無限ループが発生しました。 【環境】 Oracle:10g Access:2010 Dim CON As New ADODB.Connection 'Oracle側コネクション Dim RS As ADODB.Recordset 'Oracle側レコードセット Dim SQL As String 'Oracle側SQL文 Dim i As Integer '処理用インクリメント Dim DT As Date '抽出日付変数(日付型) Dim sDT As String '抽出日付変数(テキスト型) Dim RS2 As ADODB.Recordset 'Access側レコードセット ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) ’取得したレコード数表示 MsgBox "オラクル側のレコード数は: " & RS.RecordCount (1)↑↑↑オラクルから、抽出したレコード数表示 rs2.Open "新しいテーブル名", CurrentProject.Connection, adOpenKeyset, adLockOptimistic rs.MoveFirst Do Until rs.EOF rs2.AddNew rs2!カラム1 = rs!カラム1 rs2!カラム2 = rs!カラム2 rs2!カラム3 = rs!カラム3 rs2.Update rs2.Close: Set rs2 = Nothing rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 上記を実行したところ、いくら待っても処理がおわらず、強制終了をかけた所、新テーブルには、約150万件追加されてました。 (1)でオラクルから抽出した、レコード数を表示させてみた所、-1でした。 ◎疑問点、 -1ってありえない数値だと思うのですが。 ちなみに、オラクル側で同様のSQLを実行させた所、取得件数は48件でした。 上記について、ご存じの方がいらっしゃいましたら、アドバイスお願いいたします。

  • アクセスVBA TOP値を変数

    フォーム内テキストボックスの数値を、SELECT TOP の変数にしたくて、コマンドボタンを押した時に、下記VBAを書いたところ、実行時エラー7874 と出て、下から2行目でエラーとなりました。 Private Sub command1_Click() Dim 抽出数 As Integer Dim mySQL As String 抽出数 = Me![text1] mySQL = "SELECT * FROM T_1 AS Q_TEMP WHERE 顧客CD in (SELECT TOP " & 抽出数 & " 顧客CD FROM T_1 WHERE 支店CD=Q_TEMP.支店CD ORDER BY 売上金額 DESC,顧客CD) ORDER BY 支店CD, 売上金額 DESC , 顧客CD;" DoCmd.OpenQuery mySQL End Sub やりたい事は、テーブル:T_1に下記レコードがあり、各支店ごとのトップ売上金額2を抽出したいのと、トップ2を変数にしたいのです。 支店CD 顧客CD 売上金額 1 11 1,000 1 12 2,000 1 13 3,000 1 14 4,000 2 15 2,000 2 16 3,000 2 17 4,000 2 18 5,000 3 19 5,000 3 20 5,000 3 21 5,000 3 22 5,000 を、上記SQL文で、下記の結果にしたい 支店CD 顧客CD 売上金額 1 13 3,000 1 14 4,000 2 17 4,000 2 18 5,000 3 19 5,000 3 20 5,000 (売上金額が同じなら、顧客CDの小さい方から2つ) どこが間違っているか教えてもらえますか?