• ベストアンサー

ACCESSのクエリの関数について

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

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.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 に変更してください。 以上、変更したところは先頭のフィールドから 計算を開始する場合でも使えます。

popo4655
質問者

お礼

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

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

回答No2の最後、popo4655になっていましたが、 正しくは「popo4655さん」です。敬称が 抜けていました。申し訳ありません。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

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

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

>列の標準偏差はテーブルの集計で出来ます >レコードの標準偏差を求めたい ということは、各レコードのフィールドを 横に演算したいということですか。 横のものを縦にして計算したい、ということですか。 縦のものを横にしたいというのは時々 お目にかかりますが。 クエリで出来るのかできないのか朝から頭が 回らないので手っ取り早くコードで計算します。 ひょっとしたらクロス集計クエリでどうにか なるかもしれませんが、そのあたりは だれか気を利かして回答するかもしれません。 こういう計算は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のテーブルの構造をお聞きしてから コードを書いたほうがよかったかもしれませんが。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

クエリで作って、SQLビューにすると簡単にわかります。 SELECT StDev(TableName.FieldName) AS FieldNameの標準偏差 FROM TableName;

popo4655
質問者

お礼

有難うございました。