• ベストアンサー

Access SQLでnull値のOrderby

お世話になります、 AccessのSQLについて教えてください。 例えば打率をSQLの中で計算させたとします。その値で Order by して表示させたいのですが、計算結果がnull (打席が0の人)は分母が0になってしまい値が存在しない (null)ですよね、その場合にOrder byを行うとSQLでエラーになってしまいます。 このような場合皆様ならどのように回避されるでしょうか? select B.daritu From (select hit/dasu As daritu From A ) As B Order by B.daritu

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.1

IIf関数とNz関数を使ってみてはどうでしょうか。 例えば、 SELECT A.Simei, A.dasu, A.hit, IIf(Nz([dasu])=0,Null,[hit]/[dasu]) AS daritu FROM A ORDER BY IIf(Nz([dasu]),Null,[hit]/[dasu])

takataka111
質問者

お礼

ご回答ありがとうございました。 ja7awuさんの回答のとおりです、見事できました。 ありがとうございました。

関連するQ&A

  • SELECT 文の NULL列は?

    ある人に、こんなSQLを教えてもらいました。 ----------------------------- select id,tid,NULL as "res_no",account_id,name,date from t_game_bbs as a union select id,tid,res_no,account_id,name,date from t_game_res as b where del_flg != 1'; order by date DESC limit 10; -------------------------------- 不思議に思ったのが、”NULL as "res_no"”のところです。 これについて、ググッて見たのですが、明確な説明が見つかりませんでした。 これって、SQLの隠し機能なのですか?

  • シンプルなSQLの書き方がわかりません。

    以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)

  • group by  0とnull値は、平均値の計算から省きたい

    行ないたいこと group by avgのSQLで、0とnull値は、平均値の計算から省きたい 各フィールドの平均値を出力したいのですが、 0とnullの値は、平均値の計算から省いて計算する必要があります。 (分母にカウントしません) 平均値を求めるフィールドが、1つだけなら、条件式を作成することが出来たのですが、同時に3つのフィールドの計算を求める必要があります。 環境:oracle10 -table hoge 日付, a , b, c 5/4 200,null,50 5/5 200,100,0 5/6 200,null,100 期待する値(各フィールドの平均値、だたし0とnullは分母から除外) a = (200+200+200)/3 = 200 b = 100/1 = 100 c = (50+100)/2 = 75 質問1. このようなSQLは実現可能でしょうか? 質問2. 実現可能であれば、ご教示いただきたいのですが… よろしくお願いいたします。

  • Access SQLを使ったソートがずれる

    Access2003で以下のfunctionを組みました。 ************************************* Dim SQL As String Dim strList As String SQL = "" strList = "" 'サブテーブルの削除 SQL = "DELETE * FROM SUB_T" CurrentProject.Connection.Execute SQL SQL = "INSERT INTO SUB_T SELECT Master_T.* FROM Master_T WHERE " With Forms!SEARCH! '検索条件がnullの場合 If IsNull(.CODE_SRH) Then SQL = "INSERT INTO SUB_T SELECT Master_T.* FROM Master_T" End If 'コードの条件 If .CODE_SRH <> "" Then strList = "Master_T.CODE Like '" & .CODE_SRH & "%'" End If End With SQL = SQL & strList & " ORDER BY (val(CODE))" CurrentProject.Connection.Execute SQL ************************************* Master_T テーブルの CODE は テキスト型 内容は以下のとおり "001","あいうえお",.... "003","さしすせそ",.... "002","かきくけこ",.... "013","GHI",.... "011","ABC",.... 検索条件Nullの場合SUB_T テーブルには "001","あいうえお",.... "002","かきくけこ",.... "003","さしすせそ",.... "011","ABC",.... "013","GHI",.... とインサートされるはずですが、何回か実行すると・・・・ "003","さしすせそ",.... "011","ABC",.... "013","GHI",.... "001","あいうえお",.... "002","かきくけこ",.... こんなだったり "011","ABC",.... "013","GHI",.... "001","あいうえお",.... "002","かきくけこ",.... "003","さしすせそ",.... このような感じに並びます。 試しに、明示的に"ORDER BY (val(CODE)) ASC"にしても また降順ではどうかと思い、"ORDER BY (val(CODE)) DESC"にしても 同じ現象が出ます。 コードの条件を入れても同様な現象が出ます。 何が原因なのかさっぱり分かりません。 Accessのどこかを確認すべきか、VBAを見直すべきなのか ご教授いただきたいです。

  • AccessにおいてフィールドがNULLの値を0に変換するには

    下記のようなSQLで件数を取得したいと考えています。 テーブルBの件数がNULLの場合、差がNULLになってしまいます。 このような場合、差を0にしたいです。 どのように修正したらよいでしょうか。 SELECT A.ID, (A.件数-B.件数) AS 差 FROM A LEFT JOIN B ON A.ID = B.ID;

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • OracleのSQLでツリー表示取得

    いつもお世話になります。 SQLの質問なのですが、現在プロジェクトから離れていった方が書かれたSQLが違っていたので、いろいろと修正してみたのですがうまく値が取れないのでどこが間違っているかご相談したく 記述したSQL: SELECT * FROM XXXTBL WHERE keyID = 'aaa' START WITH PARENT_ID=0 CONNECT BY PRIOR PARENT_ID=ID ORDER BY ID; とりたい値:   id  項目名  PARENT_ID   0    親   null 2 A    0 3 B 0 4 B-1 3 とってきた値   id  項目名  PARENT_ID   0    親   null   0    親   null 2 A    0 3 B 0 となります。 いろいろと調べてみたのですが、何が違うのか判らず・・・・・ 現在は調査というレベルなので、テーブルには上記の4レコードのみが入っています。 keyIDは全レコードに同一のものが入っています。 もしかしたら、すごく基本なことなのかもしれませんが よろしくご教授お願いいたします。

  • accessでDISTINCT 句と矛盾

    IIFで置き換えをした結果をソートしようとしましたが、 SELECT DISTINCT a,IIF(IsNull(b), 0, 1) AS c FROM shain ORDER BY a,c [Microsoft][ODBC Microsoft Access Driver] ORDER BY 句 (c) が DISTINCT 句と矛盾しています。 というエラーになりました。 正しいSQLを教えてください。 SELECT DISTINCT a,IIF(IsNull(b), 0, 1) AS c FROM shain ORDER BY a,b も試しましたが同じようにエラーになりました。

  • sqlについて

    下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no,     isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no

  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

専門家に質問してみよう