SQLの書き方について質問です。
マスタにある項目CDはすべて表示。そこにデータ項目を表示させる。マスタにある項目CDがデータにない場合は、表示できない部分以外はNULLで表示させるにはどうしたらよいのでしょうか?
思うようにデータが取得できません。ORACLE8iです。
例えば
select * from マスタ
where データCD = '0009' の結果が
+-------------------------------------+
+ データCD | SEQ番号 | 項目CD | 項目名 |
+-------------------------------------+
0009 | 1 | 05000 | 名称1
0009 | 2 | 05100 | 名称2
0009 | 3 | 05200 | 名称3
で、
select * from データ
and データ.本支所CD = '999'
and データ.部門CD = '99' の結果が
+------------------------------------------+
+ 本支所CD | 部門CD | 項目CD | 発生額07月 |
+------------------------------------------+
999 | 99 | 05000 | 1,234
999 | 99 | 05100 | 1,235
だった場合、
select
SEQ番号,
本支所CD,
マスタ.項目CD,
マスタ.項目名,
発生額07月
from マスタ,データ
where マスタ.データCD = '0009'
and マスタ.項目CD = データ.項目CD
and データ.本支所CD = '999'
and データ.部門CD = '99'
を実行すると、
+--------------------------------------------------------+
| SEQ番号 | 本支所CD | 部門CD | 項目CD | 項目名 | 発生額07月 |
+--------------------------------------------------------+
| 1 | 999 | 99 |05000 | 名称1 | 1,234
| 2 | 999 | 99 |05100 | 名称2 | 1,235
+--------------------------------------+
と結果が返ってきますが、
+-------------------------------------------------------+
| SEQ番号 | 本支所CD | 部門CD | 項目CD | 項目名 | 発生額07月 |
+-------------------------------------------------------+
| 1 | 999 | 99 |05000 | 名称1 | 1,234
| 2 | 999 | 99 |05100 | 名称2 | 1,235
| 3 | 999 | 99 |05200 | 名称3 | NULL
+--------------------------------------+
とするためには
どういうSQLを作成したらよいのでしょうか?
「where マスタ.データCD(+) = '0009'
and マスタ.項目CD = データ.項目CD(+)
and データ.本支所CD(+) = '999'
and データ.部門CD(+) = '99' 」
にしてもだめでした。
※「マスタに存在して、データに存在しない項目コードがありますが、
それも発生額07月はNULLでよいので、それ以外の項目をすべて表示したい」のです。
説明不足だとは思いますが、どなたかご教授のほどよろしくお願いいたします。相当行き詰ってます。
No.3ベストアンサー
- 回答日時:
No.2です。
下記のような結果でもいいのであれば、こんな感じでいけると思います。
+-------------------------------------------------------+
| SEQ番号 | 本支所CD | 部門CD | 項目CD | 項目名 | 発生額07月 |
+-------------------------------------------------------+
| 1 | 999 | 99 |05000 | 名称1 | 1,234
| 2 | 999 | 99 |05100 | 名称2 | 1,235
| 3 | NULL|NULL|05200 | 名称3 | NULL
+--------------------------------------+
select
マスタ.SEQ番号,
data.本支所CD,
data.部門CD,
マスタ.項目CD,
マスタ.項目名,
data.発生額07月
from マスタ,(
select * from データ where 本支所CD = '999'
and 部門CD = '99'
) as data
where マスタ.データCD = '0009'
and マスタ.項目CD = data.項目CD(+)
>どうしても出したいのであれば項目に固定値を入れるとかしないとダメかも……)
無理矢理提示された結果を出すのなら、本支所CD,部門CDの項目ではなく、'999','99'を代わりに指定したら同じ結果は出るかなと思って書きました。
絞り込みたいのであればダメですね。
気にしないでください(笑)
#ちなみに8iはleft join使えないみたいです。
ありがとうございます!
教えてもらったとおりにやって、
なんとか出来ました!!
ちなみに、「as data」では
動かなかったので、下記のように修正しました。
select
マスタ.SEQ番号,
data.本支所CD,
data.部門CD,
マスタ.項目CD,
マスタ.項目名,
data.発生額07月
from マスタ,(
select * from データ where 本支所CD = '999'
and 部門CD = '99'
) data
where マスタ.データCD = '0009'
and マスタ.項目CD = data.項目CD(+)
これでようやく先週から悩んでいた問題が解決しました。
やっと業務が進みます。
今回はお手数かけました。
どうもありがとうございました。
No.2
- 回答日時:
>マスタにある項目CDはすべて表示。
そこにデータ項目を表示させる。マスタにある項目CDがデータにない場合は、表示できない部分以外はNULLで表示させるにはどうしたらよいのでしょうか?とのことですが、
+-------------------------------------------------------+
| SEQ番号 | 本支所CD | 部門CD | 項目CD | 項目名 | 発生額07月 |
+-------------------------------------------------------+
| 1 | 999 | 99 |05000 | 名称1 | 1,234
| 2 | 999 | 99 |05100 | 名称2 | 1,235
| 3 | 999 | 99 |05200 | 名称3 | NULL
+--------------------------------------+
この結果を望んでいるとなると若干違いませんか?
本支所CD・部門CDはデータテーブルから取得しているのでNULLになると思うのですが。
select
SEQ番号,
本支所CD,
部門CD,
マスタ.項目CD,
マスタ.項目名,
発生額07月
from マスタ,データ
where マスタ.データCD = '0009'
and マスタ.項目CD = データ.項目CD(+)
上記で結合は可能です。
(本支所CD・部門CDで絞り込むとNULLのレコードが消えてしまうので条件から外しています。
どうしても出したいのであれば項目に固定値を入れるとかしないとダメかも……)
この回答への補足
回答ありがとうございます!
>この結果を望んでいるとなると若干違いませんか?
>本支所CD・部門CDはデータテーブルから取得しているのでNULLになると思うのですが。
はい、確かにそうなんですが、件数が多い為どうしても絞って結果に出したいのです。
>どうしても出したいのであれば項目に固定値を入れるとかしないとダメかも……)
実際にどのように書いたらよろしいでしょうか?
サンプルなど載せていただけますと助かるのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(データベース) CDデータ 泣き寝入りするしかないのでしょうか 4 2022/09/08 23:37
- Windows 10 Windows11 を初期状態に戻す方法について。 2 2022/11/21 20:09
- スピーカー・コンポ・ステレオ CD-Rについて教えていただけませんか!? 9 2022/12/12 23:04
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
- USBメモリー・SDカード・フラッシュメモリー オリジナルのデータを預けたくないです 3 2022/09/12 01:51
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- 一眼レフカメラ CD-Rのバックアップを作ったら読み込みに時間がかかる 3 2022/09/20 22:53
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- 一眼レフカメラ 写真屋でCD化してもらったCDも劣化するのですか 1 2022/09/09 00:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
項目名の制限について
-
SQLでグループ化した結果の件数...
-
Excel 2019 のピボットテーブル...
-
セルの右クリックで出る項目を...
-
エクセルVBAで5行目からオート...
-
「直需」の意味を教えてください
-
Accessクエリーで両方のテーブ...
-
異なるサーバのDBデータ同士を...
-
ACCESSのクエリで集計で、先頭...
-
Accessでテーブルの値をテキス...
-
Accessでテーブル名やクエリ名...
-
Vbaでアクセスからエクセルにリ...
-
access テーブル内のレコード...
-
Accessでコードを入れると名前...
-
ワードでの単純作業の効率化に...
-
ACCESS で マクロの中でフィ...
-
変数が選択リストにありません
-
Oracleのビュー作成時に「指定...
-
ExcelのデータをコピーでACCESS...
-
ACCESSで指定されたテーブルか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
項目名の制限について
-
MySQLで改行を含む文の登録のし...
-
SQLでグループ化した結果の件数...
-
オラクルSQLの累計値取得方法に...
-
ORA-01722: 数値が無効です
-
SQL文 2つのテーブルから、グ...
-
列名無効について
-
フォームで検索 エラーの表示...
-
改行コードを削除して取得する...
-
3つのテーブルの結合
-
各店舗毎の最大売上の項目を取...
-
インサート文での条件の指定に...
-
Accessで期間指定の売上合計と...
-
アクセス レポート作成のため...
-
データベースから抽出した一覧...
-
SQL抽出方法に悩んでいます。 S...
-
GROUP BYの記述方法について
-
SQL文のエラーについて
-
AccessVBA コードをスキップし...
-
Oracleでテーブルの結合について
おすすめ情報