- ベストアンサー
SQL文おしえてください
例えば、以下のような 2 つのテーブルがあるとします。 営業所テーブル (会社名) (担当者名) 会社A 担当者A 会社A 担当者B 会社B 担当者C 会社C 担当者D 商品売上テーブル (担当者) (売上) 担当者A 10万 担当者C 5万 担当者D 10万 これを以下のように会社名Aの会社だけを条件に「担当者B」の売上レコードがない場合でも、ゼロ件としてレコードを取得したいんですがどのようにすればよいのでしょうか。 (会社名)(担当者) (売上) 会社A 担当者A 10万 会社A 担当者B 0万 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
storkさんからACCESSの回答が出ていますのでOracleなどの場合を。 select 営業所テーブル.会社名, 営業所テーブル.担当者名, 商品売上テーブル.売上 from 営業所テーブル,商品売上テーブル where 営業所テーブル.担当者=商品売上テーブル.担当者(+) and 営業所テーブル.会社名='会社A' ; です。 (+)を付けないと担当者Bは検索されません。
その他の回答 (3)
- stork
- ベストアンサー率34% (97/285)
関連付けしたテーブルに行が存在しないときも表示したい場合は「left(right) outer join」を使用します。 ご質問のケースでいくと select 営業所テーブル.会社名, 営業所テーブル.担当者名, 商品売上テーブル.売上 from 営業所テーブル left outer join 商品売上テーブル on 営業所テーブル.担当者=商品売上テーブル.担当者 where 営業所テーブル.会社名='会社' ですかね。 そのまま実行すると売上は0(ゼロ)ではなくnullになります。空白ではなく0で出力したければ、何らかの方法で0に置き換えることが必要になりますが、製品、開発環境固有の部分になりますので割愛させていただきます。 おせっかいですが、質問の例のテーブルは構造がおかしいように感じます。単なる例ならばいいのですが.....。
- Haizy
- ベストアンサー率40% (404/988)
katu777さん、こんにちは。 悪戦苦闘しているようですね。 select 商品売上.担当者 sum(商品売上.売上) from 商品売上 営業所 where 営業所.会社名=”会社A” 営業所.担当者=商品売上.担当者(+) group by 商品売上.担当者 で、出来ませんか? 解説) グルーピングと、集計関数・外部結合を使用します。 ★外部結合 ※ゼロの場合でも、NULLで、返します (+)は、ORACLEの記述です。 SQLServerでは、左辺後(=の前)に *を入れます。 ゼロでなくNULLが着あえって来るので、NVL(Not Value-ORACLE)などを使用して、工夫してください。 参考になれば。 でわ
結果の部分、 (担当者) (売上) 担当者A 10万 担当者A 0万 は、 (担当者) (売上) 担当者A 10万 担当者B 0万 の間違いですよね?(^^;; いろんな方法があると思うのですが、DBの種類によって異なります。 種類を教えていただけないでしょうか? OracleとかSQLサーバーとか、Accessとか・・・。 基本的に外部結合にして、「nullだったら0」という形でコンバートするか、sum関数をかませばいけるような気がします。
補足
担当者Bは0万の間違いです。すいません。 DBの種類はOracleです。