プロが教えるわが家の防犯対策術!

例えば、以下のような 2 つのテーブルがあるとします。

営業所テーブル (会社名) (担当者名) 
         会社A 担当者A
         会社A 担当者B
         会社B 担当者C
         会社C 担当者D

商品売上テーブル (担当者) (売上)
          担当者A  10万
          担当者C   5万
          担当者D  10万

これを以下のように会社名Aの会社だけを条件に「担当者B」の売上レコードがない場合でも、ゼロ件としてレコードを取得したいんですがどのようにすればよいのでしょうか。
  (会社名)(担当者) (売上)
   会社A  担当者A  10万
   会社A  担当者B   0万

よろしくお願いします。

A 回答 (4件)

storkさんからACCESSの回答が出ていますのでOracleなどの場合を。



select 営業所テーブル.会社名,
営業所テーブル.担当者名,
商品売上テーブル.売上
from 営業所テーブル,商品売上テーブル
where 営業所テーブル.担当者=商品売上テーブル.担当者(+)
and 営業所テーブル.会社名='会社A'
;

です。

(+)を付けないと担当者Bは検索されません。
    • good
    • 0

関連付けしたテーブルに行が存在しないときも表示したい場合は「left(right) outer join」を使用します。



ご質問のケースでいくと

select 営業所テーブル.会社名,
    営業所テーブル.担当者名,
    商品売上テーブル.売上
from 営業所テーブル left outer join 商品売上テーブル
   on 営業所テーブル.担当者=商品売上テーブル.担当者
where 営業所テーブル.会社名='会社'

ですかね。
そのまま実行すると売上は0(ゼロ)ではなくnullになります。空白ではなく0で出力したければ、何らかの方法で0に置き換えることが必要になりますが、製品、開発環境固有の部分になりますので割愛させていただきます。

おせっかいですが、質問の例のテーブルは構造がおかしいように感じます。単なる例ならばいいのですが.....。
    • good
    • 0

katu777さん、こんにちは。


悪戦苦闘しているようですね。

select 商品売上.担当者
    sum(商品売上.売上)
from 商品売上
   営業所
where 営業所.会社名=”会社A”
   営業所.担当者=商品売上.担当者(+)
group by 商品売上.担当者

で、出来ませんか?

解説)
グルーピングと、集計関数・外部結合を使用します。
★外部結合
※ゼロの場合でも、NULLで、返します
(+)は、ORACLEの記述です。
SQLServerでは、左辺後(=の前)に *を入れます。
ゼロでなくNULLが着あえって来るので、NVL(Not Value-ORACLE)などを使用して、工夫してください。

参考になれば。
でわ
    • good
    • 0

結果の部分、


  (担当者) (売上)
  担当者A  10万
  担当者A   0万

は、
  (担当者) (売上)
  担当者A  10万
  担当者B   0万
の間違いですよね?(^^;;

いろんな方法があると思うのですが、DBの種類によって異なります。
種類を教えていただけないでしょうか?
OracleとかSQLサーバーとか、Accessとか・・・。

基本的に外部結合にして、「nullだったら0」という形でコンバートするか、sum関数をかませばいけるような気がします。

この回答への補足

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

補足日時:2001/09/27 12:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!