こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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文を書けばいいのでしょうか?
ご存知の方いらっしゃいましたら、ご教授お願いします。

投稿日時 - 2004-12-01 11:08:17

QNo.1107674

すぐに回答ほしいです

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

下記のように行えば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.名前

投稿日時 - 2004-12-01 11:30:06

補足

早速の回答ありがとうございます。

先ほど試してみたところ、
「クエリ式,'ISNULL(B.労働時間,0)'の関数で使用されている引数の数が正しくありません。」

というエラーがでてしまいました(--;)
一体どういうことなんでしょうか?
色々ためしてみましたが、ダメでした…。

投稿日時 - 2004-12-01 15:35:06

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(7)

つまらない事を確認して申し訳ありませんが、#1のステートメントと全く同じ書き方ですか?Left JoinがただのJoinになっていませんか?

.NETのことは良く分かりません。もしだめであるならば、#3の回答でも解決できると思います。

select 名前,
case when 出勤日 => '2004/11/29' then 労働時間 else 0 end as 労働時間
from テーブル名

投稿日時 - 2004-12-03 15:33:04

お礼

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

投稿日時 - 2004-12-07 09:40:20

#5の補足です。
もしOracleでしたら、#1のSQL文のISNULLをnvlに変えて実行してみてください。

ちなみにSQLのCase-Whenに相当するOracleの命令はDecodeです。
DECODE( <式1> , <判定値1> , <結果値1> [ , <判定値2> , <結果値2> , ... ] [ , <デフォルト値> ] )

投稿日時 - 2004-12-03 09:21:29

補足

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

でした。。。
やはりASP.NETと何か関係があるんでしょうか?

投稿日時 - 2004-12-03 14:32:06

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

投稿日時 - 2004-12-03 08:55:07

ANo.4

そのエラーの出るSQL文を載せてください。

CREATE TABLE文から載せてもらった方がよい気がします。

投稿日時 - 2004-12-02 19:17:30

全て抽出するわけだから、Where句に条件として書かかなければ良いだけです。
その上で、表示を小細工したいということなので、加工式を書く。

select
名前,
case
when 出勤日 = '2004/11/29' then 労働時間 else 0 end as 労働時間
from テーブル名

投稿日時 - 2004-12-02 17:06:08

ANo.2

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

投稿日時 - 2004-12-02 16:44:54

補足

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

本当に補足なのですが、ASP.NETで使っています。
それに何か関係があるのでしょうか?

投稿日時 - 2004-12-03 14:28:45

あなたにオススメの質問