Access学習メモ 1-9. Nullってなあに

Access学習メモ 1-9. Nullってなあに

コンテンツ
学び
クエリを通してテーブルを学ぶ...
選択クエリ作成問題で登場する式
・発注数量 = 最大在庫数(計)ー(出庫数(計)-入庫数(計))

Accessの集計関数で表現すると、こうなるらしい。
発注数量: [最大在庫数] - ( Nz(Sum([出庫数]),0) - Nz(Sum([入庫数]),0) )

” Nz(Sum([]),0)”とは?
トランザクションテーブルに対象レコードが1件も見当たらない場合、
Sum() は合計値を出せず“結果なし(Null)”になる。
その Null が式に混ざると計算結果を出せなくなるため、
Null を0(ゼロ)に置き換える保険として Nz(Sum([ ]),0) が使われる。

” Nz(Sum([]),0)”が最大在庫数には不要な理由
商品マスタの「最大在庫数」は1商品につき1行だけ存在する固定値であり、設計上Nullになる恐れはない。
データインポート用のExcelにも数字がしっかり入っており、Nz()不要。
1商品につきデータ1件の構成なので、集計Sum() も必要ない。

” Nz(Sum([]),0)”が必要なのはトランザクションテーブル上の「入庫数/出庫数」だけ
Sum([出庫数]) :出庫数の合計
Sum([入庫数]) :入庫数の合計

Sum()は「対象レコードが1件もない」場合にNullを返す(計算できる材料が揃わないことにより算定結果を出せないと判断する)働きがある。
対象レコードが 1 件以上 → 合計値(数値)を認める
対象レコードが 0 件 → Nullを認める

例:
「商品マスタ」のある商品に対し、
入出庫トラン上の入庫が1回も無い → Sum([入庫数]) = Null
入出庫トラン上の出庫が1回も無い → Sum([出庫数]) = Null

トランザクションテーブル上のデータに対し集計が必要な場合は、Sum() 内にNullが混在する可能性を考え、 計算式にはあらかじめNz(Sum([]),0)を適用した方が安心ということ。

空文字("")と Null の違い
テーブルやフォームの空欄は、人間の目には等しく未入力と映る。
Access (内部)では:
空文字("")= 値あり(長さゼロ)。中身が空なだけの「空文字」という箱が存在している状態なので、計算や比較ができる。
Null = 値なし。数字でも文字でも「空っぽ」でもなく 箱じたいが存在しないので、計算も比較もできない(成立しない)。

Accessの計算ルールにおいて、Null を含む計算式は
「5 + Null = Null」「Sum() = Null → 発注数量:Null」
のようにNull値がその後の計算結果にも波及する。
Sum()を Nz(...,0) で包んであげて、これは数字のゼロに等しい値ですよと伝えることで、AccessはErrorのない適切な処理を行うことができる。

◎SQL(今回の集計関数含む)
データベース側の計算・・・Sum() がレコード0件だとNull
◎VBA
アプリ側の計算・・・「値が見つからない」とNull
いずれも、Nullを含むことで計算不能となる点は同じ。

 Nz()やNullの理解はSQLやVBAを扱うようになってから...というイメージだったけど、テーブルの段階から物語は始まっているということかな。

上記(Nz(Sum([出庫数]),0) - Nz(Sum([入庫数]),0) )については「理論在庫数」として集計するよう設題指示があるため、発注数量の計算式と切り離したサブクエリをあらかじめ組むことで、 Nz()を多用せずに済んで助かった。
昔も今も理数系が大の苦手。ひとつひとつ納得しないと習得できない。
この先どうなるかな...


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す