• ベストアンサー

SQL文おしえてください

例えば、以下のような 2 つのテーブルがあるとします。 営業所テーブル (会社名) (担当者名)           会社A 担当者A          会社A 担当者B          会社B 担当者C          会社C 担当者D 商品売上テーブル (担当者) (売上)           担当者A  10万           担当者C   5万           担当者D  10万 これを以下のように会社名Aの会社だけを条件に「担当者B」の売上レコードがない場合でも、ゼロ件としてレコードを取得したいんですがどのようにすればよいのでしょうか。   (会社名)(担当者) (売上)    会社A  担当者A  10万    会社A  担当者B   0万 よろしくお願いします。

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.4

storkさんからACCESSの回答が出ていますのでOracleなどの場合を。 select 営業所テーブル.会社名, 営業所テーブル.担当者名, 商品売上テーブル.売上 from 営業所テーブル,商品売上テーブル where 営業所テーブル.担当者=商品売上テーブル.担当者(+) and 営業所テーブル.会社名='会社A' ; です。 (+)を付けないと担当者Bは検索されません。

その他の回答 (3)

  • stork
  • ベストアンサー率34% (97/285)
回答No.3

関連付けしたテーブルに行が存在しないときも表示したい場合は「left(right) outer join」を使用します。 ご質問のケースでいくと select 営業所テーブル.会社名,     営業所テーブル.担当者名,     商品売上テーブル.売上 from 営業所テーブル left outer join 商品売上テーブル    on 営業所テーブル.担当者=商品売上テーブル.担当者 where 営業所テーブル.会社名='会社' ですかね。 そのまま実行すると売上は0(ゼロ)ではなくnullになります。空白ではなく0で出力したければ、何らかの方法で0に置き換えることが必要になりますが、製品、開発環境固有の部分になりますので割愛させていただきます。 おせっかいですが、質問の例のテーブルは構造がおかしいように感じます。単なる例ならばいいのですが.....。

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.2

katu777さん、こんにちは。 悪戦苦闘しているようですね。 select 商品売上.担当者     sum(商品売上.売上) from 商品売上    営業所 where 営業所.会社名=”会社A”    営業所.担当者=商品売上.担当者(+) group by 商品売上.担当者 で、出来ませんか? 解説) グルーピングと、集計関数・外部結合を使用します。 ★外部結合 ※ゼロの場合でも、NULLで、返します (+)は、ORACLEの記述です。 SQLServerでは、左辺後(=の前)に *を入れます。 ゼロでなくNULLが着あえって来るので、NVL(Not Value-ORACLE)などを使用して、工夫してください。 参考になれば。 でわ

noname#1785
noname#1785
回答No.1

結果の部分、   (担当者) (売上)   担当者A  10万   担当者A   0万 は、   (担当者) (売上)   担当者A  10万   担当者B   0万 の間違いですよね?(^^;; いろんな方法があると思うのですが、DBの種類によって異なります。 種類を教えていただけないでしょうか? OracleとかSQLサーバーとか、Accessとか・・・。 基本的に外部結合にして、「nullだったら0」という形でコンバートするか、sum関数をかませばいけるような気がします。

katu777
質問者

補足

担当者Bは0万の間違いです。すいません。 DBの種類はOracleです。

関連するQ&A

専門家に質問してみよう