回答編集履歴

1

説明追記

2020/05/14 05:03

投稿

hatena19
hatena19

スコア33757

test CHANGED
@@ -1,3 +1,5 @@
1
+ 修正依頼のコメントより
2
+
1
3
  > NULLでの条件分岐を知りたいという想いが強い為、
2
4
 
3
5
  現状では祝日や年末年始については大丈夫です。
@@ -37,3 +39,91 @@
37
39
  "Cint(Nz(T2.安値,T3.安値)*10*0.99) / 10 AS 安値予想, " & _
38
40
 
39
41
  ```
42
+
43
+
44
+
45
+ 追記
46
+
47
+ ---
48
+
49
+
50
+
51
+ 修正依頼のコメントより
52
+
53
+ > ちなみにどのように前のレコードを参照したら良いでしょうか?SQLは縦の情報の取得が非常に理解しにくい状態です。
54
+
55
+ 日付けなら固定値なので取得できるのは分かるのですがその他の値は変動しているので参照できません。
56
+
57
+ ID的な項目を作ってそれを連結するという感じでしょうか?
58
+
59
+
60
+
61
+ いろいろな方法がありますが、自身よりの前の日付の最大値のレコードというロジックでSQLを組むと下記のような感じです。(予想値の計算等は省略してます。
62
+
63
+
64
+
65
+ ```SQL
66
+
67
+ SELECT T2.*, T3.安値, T3.高値 FROM
68
+
69
+ (SELECT T1.*,
70
+
71
+ (SELECT Max(日付け) FROM ドル円 WHERE 日付け < T1.日付け) AS 直近日
72
+
73
+ FROM ドル円 AS T1) AS T2
74
+
75
+ LEFT JOIN ドル円 AS T3
76
+
77
+ ON T2.直近日 = T3.日付け;
78
+
79
+ ```
80
+
81
+ ご推察の通りに**SQLは縦の情報の取得は苦手**で、複雑かつ重い処理になりがちです。
82
+
83
+ このような場合は、DAOかADOでレコードセットを取得して、レコード移動しながら処理するとシンプルかつ高速になります。
84
+
85
+
86
+
87
+ コード例
88
+
89
+ ```vba
90
+
91
+ Dim rs1 As Dao.Recordset
92
+
93
+ Set rs1 = CurrentDB.OpenRecordSet("SELECT * FROM ドル円 ORDER BY 日付け;")
94
+
95
+
96
+
97
+ Dim rs2 As Dao.Recordset
98
+
99
+ Set rs2 = CurrentDB.OpenRecordSet("本日の予想と結果")
100
+
101
+
102
+
103
+ Dim 直近安値, 直近高値
104
+
105
+ Do Until rs1.EOF
106
+
107
+ rs2.AddNew
108
+
109
+ rs2!日付け = rs1!日付け
110
+
111
+ rs2!安値結果 = rs1!安値
112
+
113
+ rs2!高値結果 = rs1!高値
114
+
115
+ rs2!安値予想 = Cint(直近安値*10*1.01) / 10
116
+
117
+ rs2!高値予想 = Cint(直近高値*10*1.01) / 10
118
+
119
+ rs2.Update
120
+
121
+ 直近安値 = Nz(rs1!安値)
122
+
123
+ 直近高値 = Nz(rs1!高値)
124
+
125
+ rs1.MoveNext
126
+
127
+ Loop
128
+
129
+ ```