• 締切済み

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

営業日のみデータが入力されているテーブルを元に 非営業日(土日祝祭日など)のレコードを前営業日の レコードを参照して補いたいと考えています。 例) 主キーが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です。 わかりにくい説明で申し訳ありませんが、 よろしくお願いいたします。

みんなの回答

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

もう解決されているかもしれませんが、一応。 VBA にて行う例です。 ■不足に事態に備えファイルのバックアップは必ず取って置いてください■ ツールの参照設定から Microsoft DAO 3.6 Object Library にチェックを入れてください。 以下を標準モジュールにコピペして実行してみてください ※この頃ポカが多いので検証はじっくりと・・・。 Sub test() '要参照設定 DAO 3.6 Object Library   Dim db As DAO.Database   Dim rsFromA As DAO.Recordset   Dim rsFromB As DAO.Recordset   Dim rsTmp As DAO.Recordset   Dim rsTo As DAO.Recordset   Dim i As Long   Set db = CurrentDb   Set rsFromA = db.OpenRecordset("select DT from T1 group by dt order by DT", dbOpenSnapshot)   Set rsFromB = db.OpenRecordset("select DT from T1 group by dt order by DT", dbOpenSnapshot)   Set rsTo = db.OpenRecordset("select * from T1 order by DT", dbOpenDynaset)      rsFromB.MoveNext      Do Until rsFromB.EOF     i = 0     If rsFromA!DT <> rsFromB!DT Then              Do Until rsFromB!DT = rsFromA!DT + i + 1                  Set rsTmp = db.OpenRecordset _           ("select * from T1 where dt =#" & rsFromA!DT + i & "#", dbOpenSnapshot)         i = i + 1                    Do Until rsTmp.EOF           rsTo.AddNew           rsTo!DT = rsFromA!DT + i           rsTo!NM = rsTmp!NM           rsTo!FEE = rsTmp!FEE           rsTo!REF = rsFromA!DT           rsTo.Update           rsTmp.MoveNext         Loop                  rsTmp.Close: Set rsTmp = Nothing       Loop     End If     rsFromA.MoveNext: rsFromB.MoveNext   Loop   rsTo.Close: Set rsTo = Nothing   rsFromA.Close: Set rsFromA = Nothing   rsFromB.Close: Set rsFromB = Nothing   db.Close: Set db = Nothing End Sub

  • 894yyyy
  • ベストアンサー率25% (1/4)
回答No.1

ユニオンクエリはご存じでしょうか。 ユニオンクエリはSQL文を書かなければいけませんが、とても便利です。 たぶんこの場合に使えるでしょう。 手順として、 (1)前営業日のレコードを元に非営業日を表示したフィールドを設けたクエリ(条件で営業日のフィールドは非営業日の前営業日だけ表示するようにする。非営業日の前営業日はフラグでもたてたらいいでしょう。)を作る。 (2)営業日のみデータが入力されているテーブルと(1)で作成したクエリでユニオンクエリを作成する。 以上。 わかりにくい回答ですみません。

関連するQ&A

  • このようなレコードの抽出・生成方法

    下記のようなテーブル、レコードがあるとします。 (テーブルAとテーブルBのコードは同意) テーブルA(PK:コードA,コードB,コードC,コードD) コードA コードB コードC コードD 000001 001 00 01 000001 001 00 02 000001 001 00 03 000001 002 00 01 000001 002 00 02 000001 002 00 03 テーブルB(PK:コードA,コードB) コードA コードB 000001 001 000001 002 ここでテーブルAに1件追加されたとします。 テーブルA コードA コードB コードC コードD 000001 001 00 01 000001 001 00 02 000001 001 00 03 000001 002 00 01 000001 002 00 02 000001 002 00 03 000001 001 00 04 ここで質問なのですが、 下記のようなレコードを生成するSQLを教えて欲しいのです。 イメージとしては、コードAとコードBをテーブルBから取得し、 他の項目は、上記で追加されたレコードをコピーといった感じです。 テーブルA コードA コードB コードC コードD 000001 001 00 01 000001 001 00 02 000001 001 00 03 000001 002 00 01 000001 002 00 02 000001 002 00 03 000001 001 00 04 000001 002 00 04 ←生成したいレコード わかりにくい質問で申し訳ないですが、 よろしくお願いいたします。

  • アクセスで営業日を計算させる方法について

    アクセス2003で作業管理のデータベースを作っています。 フォームで入力された作業開始日に部品ごとに決まっている規定作業日数(営業日のみ)をたして作業完了予定日を出したいのですが、うまくできなくて、どうしようもなくなってしまい、質問させていただきました。 ○テーブル「部品マスタ」 部品番号 部品名 規定作業日数 ○テーブル「カレンダー」 年月日 営業日フラッグ (営業日フラッグは、営業日が1、休業日を0としています) ○テーブル「受注マスタ」 受注ID 部品番号 作業開始日 作業完了予定日 上記「部品マスタ」と「受注マスタ」をもとにクエリを作成し、入力フォームを作成しました。 ○フォーム「受注データ入力」 (入力)受注ID (入力)部品番号 (入力)作業開始日 (表示)部品名 (表示)規定作業日数 (計算)作業完了予定日 翌営業日とか3営業日後という風に納期などを計算する方法は見つけられたのですが、そこから応用をきかすことができなくて、行き詰ってしまいました・・。どなたか助けていただける方、よろしくお願いします。

  • Excel 今日から営業日が何日間か?

    Excel 今日から営業日が何日あるか調べたいんですけども A列にカレンダー   B列に営業日(〆チェック)を入れたときに C列に今日から営業日が何日あるかを 入れたいんですけども どうしたらいいですか お願いします

  • SQLのチューニング

    テーブルのアップデートに3時間もかかってしまい困っています。 チューニングにより速度改善できそうであれば、 教えていただけませんでしょうか? UPDATE TABLE_A SET TABLE_A.MATI_CD = TABLE_B.MATI_CD, TABLE_A.UPD_DT = GETDATE(), TABLE_A.UPD_MOD = 'バッチXX' FROM TABLE_A INNER JOIN TABLE_B ON TABLE_A.KEN_CD = TABLE_B.KEN_CD AND TABLE_A.MATI_NM = TABLE_B.MATI_NM AND TABLE_B.NENDO = '2004' WHERE ( TABLE_A.MATI_CD IS NULL AND TABLE_A.MATI_NM <> '' OR TABLE_A.MATI_CD = '' AND TABLE_A.MATI_NM <> '' ) AND TABLE_A.CRE_DT >= '2004/04/01' TABLE_A KEN_CD ・・・ (key)県コード KEN_NM ・・・ 県名称 UKE_NO ・・・ (key)受付番号 EDA_NO ・・・ (key)受付番号枝番 MATI_CD・・・ 町コード MATI_NM・・・ 町名称 CRE_DT ・・・ データ新規作成日 CRE_MOD・・・ データ新規作成モジュール名 UPD_DT ・・・ データ更新日 UPD_MOD・・・ データ更新モジュール名 TABLE_B NENDO ・・・ (key)登録年度 MATI_CD・・・ (key)町コード MATI_NM・・・ 町名称 KEN_CD ・・・ 県コード CRE_DT ・・・ データ新規作成日 CRE_MOD・・・ データ新規作成モジュール名 UPD_DT ・・・ データ更新日 UPD_MOD・・・ データ更新モジュール名 TABLE_Aは受付記録を残すテーブルで、 現在およそ300万件入っています。 TABLE_Bは町コードのマスタテーブルで、 14000件入っています。 目的としては TABLE_Aの町コードがNULLで町名称が登録されている場合、 TABLE_Bのマスタから町コードを登録してやろうという修正バッチです。 これがTABLE_Bが大量データのためかわかりませんが、 3時間もかかってしまうんです。。。 何か良い手段はありませんでしょうか? ご助言お願いいたします。

  • 2つのテーブルからのレコード取得

    はじめまして。 現在、画面上で検索条件を選択し、検索ボタンを押すと結果を返すアプリケーションを作成しておりますが、 画面上の検索の条件に「空白」を加えると、検索前に空白で表示されていた件数に比べて少ない結果になる、という現象が起こっています。 原因は、テーブルAとテーブルBを外部結合させてデータを取得して表示していますが、 検索前はBにレコードを持たないデータも表示しており、対象項目に検索条件「空白」を設定すると、テーブルBにレコードを持ち、 かつ該当項目が空白(null)であるデータのみ検索して、テーブルBにレコードがないデータは検索されないため、検索前より件数が少なく表示されるためだと判明しました。 画面上空白が選択されたら、テーブルAの該当項目は空白、テーブルBにはデータを持たないレコードも表示したいのですが、 どのようにすればよいかご教示いただければ有難いです。 (検索条件は複数あり、空白を指定できる項目も複数あるという前提です。) 以上、よろしくお願い致します。

  • MySQLで複雑な式?

    私にとっては複雑な式かなと絶望しておりますが、 皆さんのお知恵をお借りしたいです。 MySQLは 4.0.20と 5.0.3を使っております。 ◆以下データ test_tbl ----------------- DT NM VL ----------------- 2005-07-22 A 1000 2005-07-22 B 1000 2005-07-25 A 2000 2005-07-25 B 2000 2005-07-26 A 3000 2005-07-26 B 3000 2005-07-27 B 4000 2005-07-27 B 4000 Aを平均すれば2500ですが、Aのデータで平均を上回るものだけを抽出したい場合は そのようなSQLを書けばよいのでしょうか? また、前日より多い場合、今回は全て当てはまりますが、 25日の前日は(土・日)なので、22日となり、単純に -1日ではうまく行きません。 前日(または2営業日前など)より多い場合を抽出するSQLの書き方が知りたいのですが、 そのような複雑な式はできるのでしょうか?

    • ベストアンサー
    • MySQL
  • 2つのテーブルに共通するレコードを削除したい

    2つのテーブルがあり、両方にID番号フィールドが存在しています。 Aテーブルは元のデータ Bテーブルは削除したいレコードのID番号 という構成になっているとき、 AテーブルとBテーブルの共通するレコードを削除するにはどうすればよいでしょうか。 ものすごく単純な質問で申し訳ないのですが...宜しくお願いします

  • テーブルAを参照先としてレコード有無の確認

    テーブル:Aがあり、そこに列:甲がある。 CSVデータをテーブル:Bにインポートする。テーブル:Bにも列:甲と同じ規格の列:乙がある。 テーブル:Bのレコードをもとにエクスポート処理を行う際、列:乙の中に列:甲にはないレコードがあった場合、その旨アラートメッセージを表示させたい。 VBAでどのように記述すればいいでしょうか? 環境:Microsoft Access 2003

  • 条件をつけてレコードを取得したい

    以下のようなA,Bテーブルから条件を指定してレコードを取得したい 【Aテーブル】 ID Bテーブル番号 0001      null 0002      null 0003      null 【Bテーブル】 シーケンス番号   ID    登録日 処理済みフラグ       0010  0001 2014/01/01        0       0011  0001 2014/01/02        1       0012  0001 2014/01/03        0 <結果> 【Aテーブル】 ID Bテーブル番号 0001     0001 0002     null 0003     null 条件としては以下の条件です。 (1)Aテーブルは全レコード出力する (2)BテーブルのAテーブルシーケンス番号が複数存在する場合、登録日が一番古いレコードを抽出する (3)Bテーブルの処理済みフラグが0のレコード以外はnullとする。 自分で抽出条件を作成したのですが、Aテーブルの0001分しか上手く抽出出来ませんでした。 SELECT * FROM Aテーブル AT (SELECT シーケンス番号, MIN(登録日) AS 登録日 FROM Bテーブル GROUP BY AテーブルID) BT1, (SELECT * FROM Bテーブル) BT2 WHERE AT.ID = BT1.ID AND BT1.登録日 = BT2.登録日 AND BT1.ID = BT2.ID AND BT2.処理済みフラグ = '0' 一度上の命令文でテーブルを作って元のテーブルとマッチングさせるしかないのでしょうか?出来れば一発で抜き出したいです。 ご教授宜しくお願いします。

  • 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の内容がどう組んでよいか、わかりません。 どうか、ご教授願います。 宜しくお願いいたします。