Accessクエリ IIFについて

このQ&Aのポイント
  • Accessクエリで2つのテーブルをIDで紐付けて項目を比較し、○×を付けたい
  • クエリCを元に前回と今回のフィールドを並べて表示し、評価する方法はあるか
  • Null同士の比較についてと、テーブルの違いによる結果の違いについて質問
回答を見る
  • ベストアンサー

Accessクエリ IIFについて

お世話になります。 2つのテーブルをIDで紐付けて、それぞれの項目を比較し、○×を付けたいと思います。 【テーブルA】  ID メーカー 型番 品名 【テーブルB】  ID メーカー 型番 品名 【クエリC】  テーブルAとテーブルBをIDで紐付けて、各フィールド名を   テーブルAの方は前回_メーカー、前回_型番、前回_品名 とし、   テーブルBの方は今回_メーカー、今回_型番、今回_品名 とする。 【クエリD】  クエリCを元に、   前回_メーカー、前回_型番、前回_品名、今回_メーカー、今回_型番、今回_品名   を並べて表示し、それぞれを以下のように評価する。   メーカー評価:IIf([前回_メーカー]=[今回_メーカー],"○","×")   型番評価:IIf([前回_型番]=[今回_型番],"○","×")   品名評価:IIf([前回_品名]=[今回_品名],"○","×")   上記3つの評価でいずれかが×となっているレコードを抽出。 しかし、前回と今回でいずれも型番が空白(Null)だった場合、上記評価を すると"×"となってしまいました。 そこで質問ですが、   ・そもそもNull同士の評価は"×"になってしまうのでしょうか?(比較できない?)   ・テーブルAはSQL Server上にあり、テーブルBはExcelをインポートしたもの   (Accessのローカルテーブル)です。この違いによるものでしょうか。 ご教授の程、宜しくお願い致します。

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

  • ベストアンサー
回答No.1

<IIFとNull値の関係> それは、添付図が示す通りです。 >そもそもNull同士の評価は"×"になってしまうのでしょうか? "〇" という結果を得るには、添付図の3つ目のやり方があります。

naoto0216
質問者

お礼

f_a_007さま ご回答ありがとうございます。 Null同士だと×になってしまうんですね。。 で、それらに0文字を付加してあげれば、評価できるように なるんですね。 大変勉強になりました!ありがとうございました。

その他の回答 (1)

回答No.2

Access2010 をお持ちでしたっけ? なら、 ヘルプで、算術演算子、比較演算子、論理演算子、演算子の優先順位 を熟読されることを強くお勧めします! (私もいまだに「えっ?」ということがあります (^_^;)) Nullが絡んでくると算術演算子では結果はかならずNullになります。 比較演算子でも同様なので 型番評価:IIf([前回_型番]=[今回_型番],"○","×") で少なくともどちらかがNullだった場合は Null ≠ True なので Trueではない方の × が採用されます。 Nullも○に含めたい場合。 そのフィールドがNullなのか「長さ0の空の文字列」なのかも考慮したほうが安全かもしれない。 (データ型によってはいらぬお節介かもしれませんが潰しは効きます) http://support2.microsoft.com/kb/883247/ja でフィールド名をを、A、B、とした場合に IIf(A=B Or (nz(A,"") = "" Or nz(B,"") = ""),"○","×") でどうじゃろね?「えっ?」だったらゴメン。

naoto0216
質問者

お礼

NotFound404さま いつもご回答ありがとうございます。 そもそも比較にNullが絡むとダメなんですね。承知しました。 >IIf(A=B Or (nz(A,"") = "" Or nz(B,"") = ""),"○","×") についですが、nz関数でA、BそれぞれでNullだった場合は""が返され それらが両方""だったら○(=それらが両方Nullだったら○)とするん ですね。 大変勉強になりました!ありがとうございました。 ※NotFound404さまのご回答に気づかず、はじめにご回答頂いた方を  BAとしました。すみません。

関連するQ&A

  • Accessクエリにて

    お世話になります。 下記テーブルがあります。 ■型番テーブル ID 型番 数量 1  A   1 2  B   1 3  C   1 4  D   1 5  E   1 ■発売日テーブル ID 型番 発売日    削除 1  A   2010/01/01 False 2  B   2010/05/01 False 3  C   2011/03/01 False 4  D   2011/05/01 True 5  E   2011/06/01 False ■上記テーブルを用いたクエリ ・型番テーブルの「型番」と発売日テーブルの「型番」を  紐付ける ・表示したいフィールドは「型番」「発売日」。 ・表示したいのは型番テーブル全件(5レコード)。 ・発売日テーブルの削除がTrueの場合、発売日を空白とする。 *************** ここで質問です。 型番テーブルの全件を表示したいところですが、条件として発売日テーブルの 削除がFalseである為、型番Dが表示されません。 発売日テーブルであらかじめ削除がFalseのみでクエリを作成し、そのクエリと 型番テーブルの「型番」で紐付ければ全件表示されることは分かっており ますが、1つのクエリで表示する方法をご教授頂ければと思います。 宜しくお願い致します。

  • Access 予めクエリを作っておきたい

    お世話になります。 毎月、2つのExcelをインポートし、シリアル番号で紐付けて エクスポートしております。 ファイルA  ID 1月 2月 3月 4月 メーカー 型番 シリアル番号 価格・・・ ファイルB  ID メーカー 型番 シリアル番号 価格・・・ ファイルAとBをインポートし、シリアル番号で紐付けて  ID 2月 3月 4月 5月 メーカー 型番 シリアル番号 価格・・・ とし、エクスポートしてます。 ※ファイルB全件に対して、ファイルAを付加するイメージです。  また5月のフィールドを追加し(Null)、4ヵ月分のみ載せるので1月は不要。 なお、エクスポートしたファイルは翌月のファイルAになります。 <質問> 上記のように、毎月ファイルAの見出しが変わる為、毎回クエリを 作成しておりますが、手間がかかります。 このようなケースでは予めクエリを作成しておくことは出来ない のでしょうか。 例えば6月のファイルAは、  ID 2月 3月 4月 5月 メーカー 型番 シリアル番号 価格・・・ で、  ID 3月 4月 5月 6月 メーカー 型番 シリアル番号 価格・・・ としてエクスポートしなければならないので、クエリとしては  ID 今月-3ヵ月 今月-2ヵ月 今月-1ヵ月 今月:Null メーカー・・・ みたいにすればよいのでしょうか。 だとしたら、「今月-xヵ月」の部分はどのような記述になるので しょうか。 ご教示の程、宜しくお願い致します。

  • Access #エラーについて

    Access初心者です。 よろしくお願いいたします。 [前提]  テーブルA のIDに紐づけてクエリBの数値をクエリCで反映させたい。  〈詳細データ〉   ・テーブルA    [ID] [名称]       1   あ     2   い     3   う     4   え     5   お   ・クエリB    [ID] [数値]     2   10     3   20     5   40   ・クエリC    [ID]  [名称] [数値]     1    あ  #エラー     2    い   10     3    う    20     4    え  #エラー     5    お   40   ・”テーブルAの[ID]”の全レコードと”クエリBの[ID]”の同じ結合フィールドだけを含めてリレーションを行っている。    ・クエリCの算式: IIf(IsError([クエリB].[数値]),0,[クエリB].[数値])  [質問]    ・クエリCの『#エラー』部分を0にしたいのですが、何か良い方法はございませんでしょうか。   ・そもそも上記のロジックは無理がありますでしょうか。    アクセスはあまりいじったことがございません。ご回答いただけますと幸いです。   よろしくお願いいたします。

  • Access クエリ上でIIFにて作ったフィールドに対する抽出

    最近Access2007を分かるシリーズで勉強しだしたほぼ素人です DATESERIAl構文のところにさしかかったのですが =dateserial([年],[月]+2,1)-1 =dateserial([年],[月]+2,0) が同じ結果になることを検証したくなりましたので Excelのシートを用意し A1=ID B1=年 C1=月 A2=row()-1 B2=int((row()-2)/12)+1900 C2=mod(row()-2,12)+1 と入力 A2:C2を下方に適当量コピーして元データを作り Excelからテーブルとして取り込みました 更に このテーブルをを元に 左端のフィールドから順に年と月をドロップしてクエリを作って このクエリの空いたフィールドに これまた左から順に date1: DateSerial([年],[月]+2,1)-1 date2: DateSerial([年],[月]+2,0) 検証: IIf([date1]=[date2],Yes,No) と入力しました ここからが本題なのですが 質問 検証と名付けたフィールドの抽出部位に0及びYes及びFalse その色々記載して見たのですが 実行させてみたところ全て date1というパラメーターを求めるウインドウが開きました 検証のフィールドの式を 検証: IIf([date1]=[date2],"合","否") と書き換えても変化はありません 今一度検証のフィールドの式を 検証: IIf(date1=date2,"合","否")と書き換え確定すると ちゃんと検証: IIf([date1]=[date2],"合","否")に変わるので [date1]及び[date2]がフィールドの名前と認識されていないことはないと思います どうしてこうなるのか どうやったら不成立をヒットさせられるのか 御教示を願います

  • Accessクエリでのグループ化

    Accessクエリでのグループ化 以下の2つのテーブルが有ります。 ■社員テーブル ID 名前 1 Aさん 2 Bさん 3 Cさん 4 Dさん 5 Eさん ■受付テーブル ID 受付内容 受付日   社員ID 1  xxxxx 2010/3/1   1 2 xxxxx 2010/3/20   3 3 xxxxx 2010/4/10   2 4 xxxxx   2010/4/11  5 5 xxxxx 2010/4/15  1 6 xxxxx 2010/4/30  2 7 xxxxx 2010/5/3  4 そこで社員毎の受付数をカウントしたいと思っています。 ※受付日が2010/4/1以上5/1未満 名前 受付回数 Aさん 1 Bさん 2 Cさん 0 Dさん 0 Eさん 1 となるイメージです。 しかし、実際にクエリを作ると結果が 名前 受付回数 Aさん 1 Bさん 2 Eさん 1 と、なってしまいます。。 名前:グループ化 受付テーブルのID:カウント 受付日:>=2010/04/01 and <2010/05/01 ※社員テーブルの『ID』と、受付テーブルの『社員ID』を  紐つけており、結合プロパティでは『社員テーブルの  全レコードと受付テーブルの同じ結合フィールドのレコード  だけを含める』としております。 あらかじめ、受付テーブルで受付期間の条件でクエリ を作成しておき、それと社員テーブルを紐つけた場合は イメージ通りの結果になるのですが、1つのクエリで 上記イメージでの結果を表示したいと思ってます。 可能でしょうか? ご教授願います。

  • Access2010「クエリが複雑すぎます」

    お世話になります。 ユニオンクエリAがあり、そのクエリを使用してクエリB(テーブルや別のクエリとも紐付け)を作成しました。問題なく抽出できます。  <クエリB>  ユニオンクエリA ----→ クエリX              |               ---→ テーブル1              |               ---→ テーブル2              |               ---→ テーブル3 新たにユニオンクエリAを使って、クエリCを作成したところ「クエリが複雑すぎます」と表示されてしまいます。いくつかのテーブル/クエリと紐付けていたので、一つずつ取っていったところ、最終的にはユニオンクエリA一つでもエラーが出てしまいます。単純な選択クエリです。 クエリBは同じユニオンクエリAを使い、複数のクエリとテーブルとを紐付けているのにも関わらずエラーとなりません。。 どのようなことが考えられますでしょうか。 Accessを起動し直したり、端末自体も再起動しましたが状況変わらずでした。 また、ユニオンクエリA単体を開いても問題無く抽出されます。 ご教授の程、宜しくお願い致します。

  • アクセスのクエリで出来る事なのでしょうか?

    以下の様な処理がクエリで出来るものかの判断がつかず、また、出来るとしてもクエリの作り方が判りません。。。 [テーブルA] コード 品名  種類 1111  A    0 1111  A    1 1111  A    2 1111  A    3 2222  B    0 2222  B    1 2222  B    2 2222  B    3 2222  B    4 3333  C    0 3333  C    1 3333  C    2 3333  C    3 3333  C    4 3333  C    5 3333  C    6 以上の様なフィールド構成を持つテーブルです。 「コード」で管理される「品名」の持つ「種類」の列の最大値を、新しく追加した「在庫」列を持つテーブルBの「在庫」列に抽出して以下の様に同一「コード」内に全て書き込みたいと思っておりますが、クエリ作成の勉強を始めたばかりで、上記の様な複雑(?)なクエリの作り方が判りません。 ※簡単なクエリをデザインビューで作ったり、SQL ビューで簡単な改造が出来る位です。 [テーブルB](処理後) コード 品名  種類 在庫 1111  A    0   3 1111  A    1   3 1111  A    2   3 1111  A    3   3 2222  B    0   4 2222  B    1   4 2222  B    2   4 2222  B    3   4 2222  B    4   4 3333  C    0   6 3333  C    1   6 3333  C    2   6 3333  C    3   6 3333  C    4   6 3333  C    5   6 3333  C    6   6 尚、「種類」列の値は必ず0から順番に(012345・・・の様に)並ぶ規則となっております。 テーブルAに「在庫」列を追加挿入してから「種類」の最大値を書き込む方法でも、テーブルB(テーブルAをコピーして「種類」列を追加したテーブル)に書き込ませる方法でもどちらでも問題はありません。 どなたかご教示頂ければと思います。宜しくお願い致します。  

  • ACCESSのクエリ

    いつもお世話になってます。 今回はACCESSのSQLのクエリについて質問します。 テーブルAを日付ごとにテーブルBのようにしたいのですがどうすれば良いでしょうか? テーブルA ID  日付  商品  個数 1   1/1  ドコモ  10 2   1/1  AU   11 3   1/1  ソフト  12 4   1/2  ドコモ   5 5   1/2  AU    4 6   1/2  ソフト   3 ・ ・ ・ テーブルB 日付   ドコモ  AU  ソフト 1/1    10    11   12 1/2     5    4    3 ・ ・ ・ わかりにくい説明かもしれませんがよろしくお願い致します。

  • Accessでのiif関数について

    はじめまして。 Microsoft Accessの関数についての質問です。 例えばクエリの「商品名」の値AをBに置き換えたい場合、 =iif([商品名]=A,B)とします。 また、商品番号1000~9999まであるとして、1000~1999を抽出したい場合は、Like "1*" もしくは、Between 1000 And 1999 とします。 この時に 商品番号1000~1999を一律1000と置き換えたい場合、クエリでやるとしたらどのようにすれば良いのでしょうか。 イメージ的には =iif([商品番号]="1*",1000)なのですが、「"1*"」の部分をどうやってもうまくいきません。 どなたか詳しい方いらっしゃいましたらお教え頂けないでしょうか。 お忙しいところ申し訳ございませんが、宜しくお願い致します。

  • アクセス クエリ・集計・計算方法について

    アクセスの集計機能を使用して、品名毎の数量の合計と金額の合計を算出しようとしていますが、 思うようにできません。どなたか教えてください。 クエリのフィールドを左から・・・ (1)年月: Format([日付],"yyyy/mm")(集計:グループ化) (2)品名(集計:グループ化) (3)品名のカウント(集計機能:カウント) (4)単価(集計:グループ化) (5)金額: [単価]*[品名のカウント](集計:グループ化) このような形でクエリを実行していますが、すべての注文が1つだけなら問題ないのですが、実際には品名には数量が掛けられている場合もあり、現在設定しているクエリ設定では正しい数量の合計と金額の合計を出すことができません。どうか集計方法をご教授いただけないでしょうか。よろしくお願いします。 ■現在のテーブルの設計とリレーションを明記します。 【A】顧客テーブル (1)顧客ID (2)発注コード (3)氏名 【B】商品テーブル (1)商品ID (2)品名 (3)単価 【C】注文テーブル (1)注文ID (2)日付 (3)顧客ID 【D】注文明細テーブル (1)注文明細ID (2)注文ID (3)商品ID (4)数量 リレーション 【A】(1)-【C】(3) 【B】(1)-【D】(3) 【C】(1)-【D】(2)