- ベストアンサー
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文を書けばいいのでしょうか? ご存知の方いらっしゃいましたら、ご教授お願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
下記のように行えば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.名前
その他の回答 (6)
- nandarou-1011
- ベストアンサー率50% (65/128)
つまらない事を確認して申し訳ありませんが、#1のステートメントと全く同じ書き方ですか?Left JoinがただのJoinになっていませんか? .NETのことは良く分かりません。もしだめであるならば、#3の回答でも解決できると思います。 select 名前, case when 出勤日 => '2004/11/29' then 労働時間 else 0 end as 労働時間 from テーブル名
お礼
がんばってみましたが、どうしてもできないので、 あきらめました(^^;) これをひきずって仕事するわけにも行かないので…。 ほんとうに、色々とありがとうございました!
- nandarou-1011
- ベストアンサー率50% (65/128)
#5の補足です。 もしOracleでしたら、#1のSQL文のISNULLをnvlに変えて実行してみてください。 ちなみにSQLのCase-Whenに相当するOracleの命令はDecodeです。 DECODE( <式1> , <判定値1> , <結果値1> [ , <判定値2> , <結果値2> , ... ] [ , <デフォルト値> ] )
補足
ご丁寧な回答本当にありがとうございます。 しかし、サーバはSQLに間違いないです。と思います。 うちにはSQLサーバしかないので。 それで先ほど、やっとエラーせずにできたんですが、 結果が、 名前 労働時間 Aさん 8時間 Bさん 7時間 でした。。。 やはりASP.NETと何か関係があるんでしょうか?
- nandarou-1011
- ベストアンサー率50% (65/128)
もしかしたら、使用しているデータベースがMicrosoftのSQL Serverではなくて、Oracleとか他のデータベースを使用している可能性がありますね。その場合、ISNULLやCASE-WHENといったステートメントが使用できません。 実際に使用しているデータベースは何でしょうか。
- PowerOn
- ベストアンサー率62% (5/8)
そのエラーの出るSQL文を載せてください。 CREATE TABLE文から載せてもらった方がよい気がします。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
全て抽出するわけだから、Where句に条件として書かかなければ良いだけです。 その上で、表示を小細工したいということなので、加工式を書く。 select 名前, case when 出勤日 = '2004/11/29' then 労働時間 else 0 end as 労働時間 from テーブル名
- Azzuri
- ベストアンサー率68% (34/50)
nandarou-1011さんの回答通りで可能だと思います。 試しましたが、正常に取得できました。
補足
ご回答ありがとうございます。 nandarou-1011さんの通りで、やっとエラーなく動きました。 しかし、結果が 名前 労働時間 Aさん 8時間 Bさん 7時間 になってしまいます。いったいなぜ? ISNULLもちゃんと使っているのに…。 本当に補足なのですが、ASP.NETで使っています。 それに何か関係があるのでしょうか?
補足
早速の回答ありがとうございます。 先ほど試してみたところ、 「クエリ式,'ISNULL(B.労働時間,0)'の関数で使用されている引数の数が正しくありません。」 というエラーがでてしまいました(--;) 一体どういうことなんでしょうか? 色々ためしてみましたが、ダメでした…。