teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

説明追記

2020/05/14 05:03

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -1,3 +1,4 @@
1
+ 修正依頼のコメントより
1
2
  > NULLでの条件分岐を知りたいという想いが強い為、
2
3
  現状では祝日や年末年始については大丈夫です。
3
4
 
@@ -17,4 +18,48 @@
17
18
 
18
19
  ```vba
19
20
  "Cint(Nz(T2.安値,T3.安値)*10*0.99) / 10 AS 安値予想, " & _
21
+ ```
22
+
23
+ 追記
24
+ ---
25
+
26
+ 修正依頼のコメントより
27
+ > ちなみにどのように前のレコードを参照したら良いでしょうか?SQLは縦の情報の取得が非常に理解しにくい状態です。
28
+ 日付けなら固定値なので取得できるのは分かるのですがその他の値は変動しているので参照できません。
29
+ ID的な項目を作ってそれを連結するという感じでしょうか?
30
+
31
+ いろいろな方法がありますが、自身よりの前の日付の最大値のレコードというロジックでSQLを組むと下記のような感じです。(予想値の計算等は省略してます。
32
+
33
+ ```SQL
34
+ SELECT T2.*, T3.安値, T3.高値 FROM
35
+ (SELECT T1.*,
36
+ (SELECT Max(日付け) FROM ドル円 WHERE 日付け < T1.日付け) AS 直近日
37
+ FROM ドル円 AS T1) AS T2
38
+ LEFT JOIN ドル円 AS T3
39
+ ON T2.直近日 = T3.日付け;
40
+ ```
41
+ ご推察の通りに**SQLは縦の情報の取得は苦手**で、複雑かつ重い処理になりがちです。
42
+ このような場合は、DAOかADOでレコードセットを取得して、レコード移動しながら処理するとシンプルかつ高速になります。
43
+
44
+ コード例
45
+ ```vba
46
+ Dim rs1 As Dao.Recordset
47
+ Set rs1 = CurrentDB.OpenRecordSet("SELECT * FROM ドル円 ORDER BY 日付け;")
48
+
49
+ Dim rs2 As Dao.Recordset
50
+ Set rs2 = CurrentDB.OpenRecordSet("本日の予想と結果")
51
+
52
+ Dim 直近安値, 直近高値
53
+ Do Until rs1.EOF
54
+ rs2.AddNew
55
+ rs2!日付け = rs1!日付け
56
+ rs2!安値結果 = rs1!安値
57
+ rs2!高値結果 = rs1!高値
58
+ rs2!安値予想 = Cint(直近安値*10*1.01) / 10
59
+ rs2!高値予想 = Cint(直近高値*10*1.01) / 10
60
+ rs2.Update
61
+ 直近安値 = Nz(rs1!安値)
62
+ 直近高値 = Nz(rs1!高値)
63
+ rs1.MoveNext
64
+ Loop
20
65
  ```