人に聞けない痔の悩み、これでスッキリ >>

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル STDEVとSTDEVPの違い

エクセルの統計関数で標準偏差を求める時、STDEVとSTDEVPがあります。両者の違いが良くわかりません。
宜しかったら、恐縮ですが、以下の具体例で、『噛み砕いて』教えて下さい。
(例)
セルA1~A13に1~13の数字を入力、平均値=7、STDEVでは3.89444、STDEVPでは3.741657となります。
また、平均値7と各数字の差を取り、それを2乗し、総和を取る(182)、これをデータの個数13で割る(14)、この平方根を取ると3.741657となります。
では、STDEVとSTDEVPの違いは何なのでしょうか?統計のことは疎く、お手数ですが、サルにもわかるようご教授頂きたく、お願い致します。

Aベストアンサー

データが母集団そのものからとったか、標本データかで違います。また母集団そのものだったとしても(例えばクラス全員というような)、その背景にさらならる母集団(例えば学年全体)を想定して比較するような時もありますので、その場合は標本となります。
で標本データの時はSTDEVを使って、母集団の時はSTDEVPをつかうことになります。
公式の違いは分母がn-1(STDEV)かn(STDEVP)かの違いしかありません。まぁ感覚的に理解するなら、分母がn-1になるということはそれだけ結果が大きくなるわけで、つまりそれだけのりしろを多くもって推測に当たるというようなことになります。
AとBの違いがあるかないかという推測をする時、通常は標本同士の検証になるわけですので、偏差を余裕をもってわざとちょっと大きめに見るということで、それだけ確証の度合いを上げるというわけです。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QACCESS DCOUNTの抽出条件について

式1: DCount("コード","テーブル","コード=" & [テーブル]![コード])

結果の2以上のものを抽出したいのですが、どのように記述するのでしょうか?

>1または>=2またはnot 1でもいいですが・・・
記述方法が良く分かりません。

Aベストアンサー

No.3です。

> コード=の構文エラー 演算子がありません。
> 不明。
> とエラーメッセージが表示されます。

そのエラーメッセージの内容からすると、『コード』が「Null」(空白)のものがある、
ということだと思います(その事態は想定していませんでした)。
一応、こちらで作成したサンプルにて、DCountを使用した場合に、同様の
メッセージ(計2件)が表示されるのは確認しました。
(補足の文意を「集計クエリで解決はできたが、DCountの方はエラーとなる」
 と取りました。もしも集計クエリの方でも上記エラーが出ているようでしたら、
 元となるテーブルとクエリの情報(フィールド名とデータ型)をお知らせ下さい)
※なお、コードは数値型と想定しています。もしも文字列方の場合は、併せて
 式を「"コード='" & [テーブル]![コード] & "'"」と変更する必要があります。

上記のエラーを回避するには、DCountの第1引数を「*」にします。
また、コードがNullのレコードで、クエリの表示結果が「#エラー」となるのを
回避するためには、第3引数にNz関数を使用します。
(コードの最小値は0か1でしょうから、「最小値-1」(=-1か0)にするのがよいかと
 思います)

【Nullは重複数に含めない場合】
DCount("*","テーブル","コード=" & Nz([テーブル]![コード],-1))
※コードがNullの場合は、第3引数の結果がTrueにならない(Null=-1)ので
 0件扱いとなるため、抽出条件の「>1」で弾かれます。
 また、第3引数にNz関数を使用する代わりに、クエリの『コード』の抽出条件に
 「Is Not Null」を指定する(→最初から集計の対象外にする)方法もあります。

【Nullも1つのコードとして重複扱いする場合】
DCount("*","テーブル","Nz(コード,-1)=" & Nz([テーブル]![コード],-1))

No.3です。

> コード=の構文エラー 演算子がありません。
> 不明。
> とエラーメッセージが表示されます。

そのエラーメッセージの内容からすると、『コード』が「Null」(空白)のものがある、
ということだと思います(その事態は想定していませんでした)。
一応、こちらで作成したサンプルにて、DCountを使用した場合に、同様の
メッセージ(計2件)が表示されるのは確認しました。
(補足の文意を「集計クエリで解決はできたが、DCountの方はエラーとなる」
 と取りました。もしも集計クエリの方でも...続きを読む

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

Qアクセス 抽出条件AかつBのカウント

度々すいません。

フィールド[色]のうち「赤色」
かつ
フィールド[大きさ]の「大」

である人(フィールド[名前])の数を抽出したいです。

Aさんは赤色の大をいくつ頼んだのか
・・・と言うことが分かれば良いのですが。

Aベストアンサー

カウントで良いなら
=DCOUNT("*","テーブル名","[名前]='A' And [色]='赤色' And [大きさ]='大'")
で出来ます。
検索値がフィールドの場合は
=DCOUNT("*","テーブル名","[名前]='" & Me![名前] & "' And [色]='" & Me![色] & "' And [大きさ]='" & Me![大きさ] & "'")
の様にすればカウントできます。

クエリで行う場合は条件抽出欄にて
「名前」「A」、「色」「赤色」、「大きさ」「大」で
「表示」「集計」を選択、項目はなんでも良いので追加して「集計」を「カウント」にしてください。

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む


人気Q&Aランキング