• ベストアンサー

副問い合わせでのNULLの抽出方法

SQLについての質問です。 副問い合わせを使用したとき、NULLのデータも含めて抽出したいの ですが、どうもうまくいきません。 やりたいことを説明すると、まず以下の構造のテーブルがあります テーブル    コード 金額  -------------- 01  |100   01  |110   02  |090   02  |080   03  |200   04  |100   04  |150   05  |400   09  |350   null |100   null |200   集約後データ コード -------- 01  |<--- 1件目 02  |<--- 2件目 03  |<--- 3件目 04  |<--- 4件目 05  |<--- 5件目 09  |<--- 6件目 null |<--- 7件目 まず、テーブルをコードで集約します。集約された結果のデータで上位○件と いう制御をかけたい為、ROWNUMを使用しています。 ただ、実際にほしいデータは集約する前のデータの為、一度集約とROWNUMを使って 絞りこんだデータを副問い合わせしています。 但し、このときNULLが入ったコードも取得する必要があります。 現在のSQLはこんな感じです。 SELECT コード、SUM(金額) FROM テーブル WHERE コード IN ( SELECT コード FROM テーブル WHERE ROWNUM <= 10 GROUP BY コード ) GROUP BY コード このSQLだと、NULLが省かれてしまうため上位6件までしか抽出できません。 実際、NULLを含んだデータを副問い合わせで取得することは可能でしょうか? データベースはオラクル9iです。 宜しくお願いします。

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

  • ベストアンサー
  • timber
  • ベストアンサー率29% (218/739)
回答No.2

SELECT A.コード, SUM(A.金額) FROM テーブル A, ( SELECT DISTINCT NVL(コード, '*') AS コード FROM テーブル WHERE ROWNUM <= 10 ) B WHERE NVL(A.コード, '*') = B.コード GROUP BY A.コード; こんな感じでどうでしょう。

jyo-chi
質問者

お礼

できました!!ありがとうございます。 NVLは知っていたのですが、フィールドと 条件の両方にかける方法は思いつかなかったです。 回答でもらったSQLは使わなかったのですが、参考にして 元のSQLを以下のように改造して成功しました。 SELECT コード、SUM(金額) FROM テーブル WHERE nvl(コード,'*')  IN(SELECT nvl(コード,'*')    FROM テーブル    WHERE ROWNUM <= 10    GROUP BY コード ) GROUP BY コード 本当にありがとうございました。今日は徹夜せずに 帰れそうです。

その他の回答 (1)

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

WHERE コード IN を WHERE コード(+) IN というふうにできるかな?

jyo-chi
質問者

補足

早速の回答、ありがとうございます。 確認してみましたが、ダメでした。 副問い合わせに対しての外部結合は無理のようです。

関連するQ&A