限定しりとり

ACCESSのクエリの関数について
列の標準偏差はテーブルの集計で出来ますが、レコードの標準偏差を求めたいと思います。
クエリの関数で、StDev(expr)のexprにレコードの[テーブルの名前]![フィールド名前]を
入れる時には","で続けるのか?
この方法では式が作成出来ません。

A 回答 (5件)

もし、計算を開始するフィールドの位置が


最初のフィールドからではない場合、

Private Sub cmdB()
Const COUNTFIELD = 8 'テーブルの計算対象のフィールド数

のあとに、

Const STARTFIELD = 0 '計算を開始するフィールドの位置

を追加してください。

この場合は0ですから、先頭のフィールドから計算を
開始します。2番目のフィールドから始める場合は

Const STARTFIELD = 1

とします。


さらに、

'集計
For i = 0 To COUNTFIELD - 1
a(i) = rs.Fields(i).Value
s = s + a(i)
Next i

のところで、

a(i) = rs.Fields(i).Value



a(i) = rs.Fields(i + STARTFIELD).Value

に変更してください。



以上、変更したところは先頭のフィールドから
計算を開始する場合でも使えます。
    • good
    • 0
この回答へのお礼

再三のご指導有難うございました。
深く感謝します。

お礼日時:2010/05/21 13:31

回答No2の最後、popo4655になっていましたが、


正しくは「popo4655さん」です。敬称が
抜けていました。申し訳ありません。
    • good
    • 0

字数いっぱいだったので、追加です。


Databaseオブジェクトを使っているので
コード表のツール→参照設定からDAO3.6
(3.6でよかったかな)
にチェックをいれてください。
以上です。
    • good
    • 0

>列の標準偏差はテーブルの集計で出来ます


>レコードの標準偏差を求めたい
ということは、各レコードのフィールドを
横に演算したいということですか。
横のものを縦にして計算したい、ということですか。
縦のものを横にしたいというのは時々
お目にかかりますが。
クエリで出来るのかできないのか朝から頭が
回らないので手っ取り早くコードで計算します。


ひょっとしたらクロス集計クエリでどうにか
なるかもしれませんが、そのあたりは
だれか気を利かして回答するかもしれません。


こういう計算はExcelに放り込んでそっちで
計算するほうが手っ取り早いのでは、という
のが大方の見方でしょうが。


テーブルの名前をTdata、フィールドを
A,B・・・・とし、標準偏差というフィールド
を追加しておきます。各フィールドは
数値型で倍精度浮動小数点型とします。
一応、他にはフィールドはないものとします。

一応、フォームに一つボタンを貼り付け
てのクリックイベントで行います。
関数に簡単に変更できるので、その時は
試してみてください。小数点以下の端折り
は適当です。標準偏差はテーブルの
標準偏差というフィールドに各レコード
ごとに算出して記録します。

各レコードのフィールドの値を配列に
読み込んで計算するので、フィールドは
簡単に連続しているものとします。
Field(i)はフィールドを示していて、
iは0から始まります。したがって、
計算対象のフィールドが10あれば
iは0から9まで変化します。
保守を簡単にするためにこの数値を
Const COUNTFIELD = 10
のようにCOUNTFIELDという定数で
管理します。計算対象のフィールドの
数が変更されるならこの10の数値を
変更すればすみます。


Private Sub コマンド0_Click()

Const COUNTFIELD = 8 'テーブルの計算対象のフィールド数
Dim db As Database
Dim rs As Recordset
Dim i As Integer
Dim fld As Field
Dim a() As Double
Dim s As Double
Dim sa As Double
Dim d As Double
Dim sd As Double

Set db = CurrentDb
Set rs = db.OpenRecordset("Tdata", dbOpenDynaset)

ReDim a(COUNTFIELD)
With rs
rs.MoveFirst
Do Until rs.EOF
s = 0
sa = 0
'集計
For i = 0 To COUNTFIELD - 1
a(i) = rs.Fields(i).Value
s = s + a(i)
Next i

'標準偏差
d = s / COUNTFIELD
For i = 0 To COUNTFIELD - 1
sa = sa + (a(i) - d) ^ 2
Next i


sd = (sa / COUNTFIELD) ^ (1 / 2)

'書式設定 少数点以下の表示形式
'必要なければ以下はコメントアウトか削除
sd = Val(Format(sd, "0.000"))
    
'テーブルへの結果書き込み
rs.Edit
rs!標準偏差 = sd
rs.Update

'確認 必要なければコメントアウトか削除
MsgBox ("合計s=" & s)
MsgBox ("標準偏差=" & sd)

rs.MoveNext
Loop
End With

Erase a
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
End Sub

フィールドを個別に配列に入れていくように
すれば様々に対応できるかもしれません。
関数化もたいして難しくないので時間が
あれば、と言う感じです。
一応、popo4655のテーブルの構造をお聞きしてから
コードを書いたほうがよかったかもしれませんが。
    • good
    • 0

クエリで作って、SQLビューにすると簡単にわかります。



SELECT StDev(TableName.FieldName) AS FieldNameの標準偏差 FROM TableName;
    • good
    • 0
この回答へのお礼

有難うございました。

お礼日時:2010/05/21 13:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す