- ベストアンサー
Access2003で前日の売上金データを取得する方法
- 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.年月日;
- お手数ですが、前日以前のデータを抽出する方法を教えていただけないでしょうか。
- みんなの回答 (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.年月日;
その他の回答 (1)
- Siegrune
- ベストアンサー率35% (316/895)
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では未確認。)
補足
ありがとうございます。回答感謝しております。 クエリ式'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.年月日' 取得条件は判ってきたのですが、 構文エラーから脱出できません(汗 もし、他の構文の書き方などご存知でしたら ご教授いただけますでしょうか?
お礼
助かりました。ありがとうございます。
補足
丁寧なご回答ありがとうございます。 早速、試させていただいてみたところ、 望みどおりの結果が算出されました。 あとは、この他に別の計算処理も組み込まなければいけないのですが、 多少パフォーマンスが心配ですが、後は自力で頑張ってみます。