• ベストアンサー

SQLサーバに対するSQL文で抽出した時にないレコードを0で表示させるには?

例えば、下記のようなデータがあったとします。 名前   出勤日  労働時間 Aさん  11月29日  8時間 Bさん  11月29日  7時間 Cさん  11月30日  9時間 Dさん  11月28日  6時間 Eさん  11月27日  3時間 これをSELECT ~ FROM テーブル名 WHERE 出勤日 = "11月29日"~とという感じで抽出した時に、 普通ならAさんとBさんのレコードのみ抽出されますよね? それを、 名前   労働時間 Aさん   8時間 Bさん   7時間 Cさん   0時間 Dさん   0時間 Eさん   0時間 という感じで抽出するにはどのようなSQL文を書けばいいのでしょうか? ご存知の方いらっしゃいましたら、ご教授お願いします。

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

  • ベストアンサー
回答No.1

下記のように行えばOKだと思います。確認していないので間違っていたらごめんなさい。 ON以下の名前でリンクしている部分はできればそのデータ固有のIDがあれば確実です。 Select A.名前,ISNULL(B.労働時間,0) as 労働時間 From テーブル名 as A Left Join (Select * From テーブル名 Where 出勤日 >= '2004/11/29') as B ON A.名前 = B.名前

KOHEI_JAPAN
質問者

補足

早速の回答ありがとうございます。 先ほど試してみたところ、 「クエリ式,'ISNULL(B.労働時間,0)'の関数で使用されている引数の数が正しくありません。」 というエラーがでてしまいました(--;) 一体どういうことなんでしょうか? 色々ためしてみましたが、ダメでした…。

その他の回答 (6)

回答No.7

つまらない事を確認して申し訳ありませんが、#1のステートメントと全く同じ書き方ですか?Left JoinがただのJoinになっていませんか? .NETのことは良く分かりません。もしだめであるならば、#3の回答でも解決できると思います。 select 名前, case when 出勤日 => '2004/11/29' then 労働時間 else 0 end as 労働時間 from テーブル名

KOHEI_JAPAN
質問者

お礼

がんばってみましたが、どうしてもできないので、 あきらめました(^^;) これをひきずって仕事するわけにも行かないので…。 ほんとうに、色々とありがとうございました!

回答No.6

#5の補足です。 もしOracleでしたら、#1のSQL文のISNULLをnvlに変えて実行してみてください。 ちなみにSQLのCase-Whenに相当するOracleの命令はDecodeです。 DECODE( <式1> , <判定値1> , <結果値1> [ , <判定値2> , <結果値2> , ... ] [ , <デフォルト値> ] )

KOHEI_JAPAN
質問者

補足

ご丁寧な回答本当にありがとうございます。 しかし、サーバはSQLに間違いないです。と思います。 うちにはSQLサーバしかないので。 それで先ほど、やっとエラーせずにできたんですが、 結果が、 名前   労働時間 Aさん   8時間 Bさん   7時間 でした。。。 やはりASP.NETと何か関係があるんでしょうか?

回答No.5

もしかしたら、使用しているデータベースがMicrosoftのSQL Serverではなくて、Oracleとか他のデータベースを使用している可能性がありますね。その場合、ISNULLやCASE-WHENといったステートメントが使用できません。 実際に使用しているデータベースは何でしょうか。

  • PowerOn
  • ベストアンサー率62% (5/8)
回答No.4

そのエラーの出るSQL文を載せてください。 CREATE TABLE文から載せてもらった方がよい気がします。

回答No.3

全て抽出するわけだから、Where句に条件として書かかなければ良いだけです。 その上で、表示を小細工したいということなので、加工式を書く。 select 名前, case when 出勤日 = '2004/11/29' then 労働時間 else 0 end as 労働時間 from テーブル名

  • Azzuri
  • ベストアンサー率68% (34/50)
回答No.2

nandarou-1011さんの回答通りで可能だと思います。 試しましたが、正常に取得できました。

KOHEI_JAPAN
質問者

補足

ご回答ありがとうございます。 nandarou-1011さんの通りで、やっとエラーなく動きました。 しかし、結果が 名前   労働時間 Aさん   8時間 Bさん   7時間 になってしまいます。いったいなぜ? ISNULLもちゃんと使っているのに…。 本当に補足なのですが、ASP.NETで使っています。 それに何か関係があるのでしょうか?

関連するQ&A