• ベストアンサー

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

  • SQLでのNULLのレコードの表示方法は?

    Windows2000,VB6,SP5で開発しています。 質問させていただきます。 例えば、下記のようなデータがあったとします。 名前   出勤日  労働時間 Aさん  11月29日  8時間 Bさん  11月29日  7時間 Cさん  11月30日  9時間 Dさん  11月28日  6時間 Eさん  11月27日  3時間 これをSQL文で、出勤日を11月29日で抽出して、 名前   労働時間 Aさん   8時間 Bさん   7時間 Cさん   0時間 Dさん   0時間 Eさん   0時間 という感じで抽出するにはどうしたらいいのでしょうか? ご存知の方いらっしゃいましたら、ご教授お願いしますm(_ _)m

  • AccessでのNULLのレコードの表示方法は?

    例えば、下記のようなデータがあったとします。 名前   出勤日  労働時間 Aさん  11月29日  8時間 Bさん  11月29日  7時間 Cさん  11月30日  9時間 Dさん  11月28日  6時間 Eさん  11月27日  3時間 これをクエリで、出勤日を11月29日で抽出して、 名前   労働時間 Aさん   8時間 Bさん   7時間 Cさん   0時間 Dさん   0時間 Eさん   0時間 という感じで抽出するにはどうしたらいいのでしょうか? ご存知の方いらっしゃいましたら、ご教授お願いします。

  • あいまい条件抽出についてのSQL文について

    あいまい条件抽出についてのSQL文について hiroです。 SQL文について、教えてほしいのですが、 下記のようなDatabaseがあったとします。 tableA:カラムA:ABCDE,BCDEA tableB:カラムB:??C?? この場合、例えば、 SELECT * FROM DataBase WHERE tableA.カラムA like tableB.カラムB みたいな感じで、カラムAのABCDEだけを検索するような仕組みを作ることは 可能でしょうか? ※上のSQL文では引っ張れないのは理解できています。 わかる方がいらっしゃいましたら、SQL文を教えてください。 よろしくお願いします。 環境:Oracle 11g

  • 抽出した行数を変数に入れたい(オラクルSQL)

    SELECTで抽出した行数を変数に格納したいのですが、上手くいきません。 SQLにあまり経験がなく、ネットで調べながら実践しております。 例えば以下の簡単なSQLを作ったとして、 ---------------------------------------------------- SELECT a,b,c,d,e,f FROM table WHERE c=10 AND e=20; ---------------------------------------------------- ここで抽出した行数を取得し、それを変数に入れたいと思っております。 というのも、後々、抽出したデータの行数を表示したい場合に SELECT COUNT(*) FROM table WHERE c=10 AND e=20; というSQLをその都度入力していては非効率だと思ったからです。 そこで抽出する際に行数を取得し、それを変数に格納して、 行数を表示する処理が今後必要になった際に、その変数を表示すれば良いと考えました。 ですがネットで変数のことを調べた際に VARやDEFINE等のコマンドを見つけましたが、SQLを実行しても上手くいきません。 最初に記載したSQLに、どのような構文を入れたら良いのでしょうか。

  • SQL文 特定のレコードを抽出したい

    以下のようなテーブルAがあったとします。 年月日,項目B ---------------------- 20080101 100 20080102 100 20080103 200 20080104 400 20080105 400 20080106 200 SQL文にて、データの抽出を行いたいのですが、 抽出したいのは、データに変更があった年月日と項目Bの値です。 年月日,項目B ---------------------- 20080101 100 20080103 200 20080104 400 20080106 200 前の年月日と比較し、項目Bに違いがあった場合のデータだけ抽出したいのですが、SQL文で行うことは可能でしょうか?? 環境は、SQL Server 2005 です。

  • sql文の書き方

    いつもこちらで勉強させていただきます。 環境:mysql5.0 PHP5.1.4 apache 2.0.58 いま画面からパラメータ5受け取りました。 これをもってsql文を書こうとするが必須入力項目ではないため一つずつ判断して書いたら30種類の可能性がでてきてすごく長くなってしまいましたがなんか短縮させるいい方法はありませんか?またこれをファンクションで作り直そうとしたらちょっとうまくいかないのでどなたか教えてもらえませんか?ファンクションで渡すパラメータ($sql?$query?あるいは各パラメータですか? )は何にすればいいか?取得したい検索結果は配列です。ファンクション戻り値を連想配列にすることは可能ですか?ちょっと困っています。 $sql = "SELECT * FROM file_tbl WHERE"; // A だけの場合 if ( $b == "" and $c == "" and $d=="" and $e==""){ $sql = $sql." a='%s' order by b DESC,a"; $query = sprintf("$sql", mysql_real_escape_string($a)); // B だけの場合 }else if( $a == "" and $c == "" and $d=="" and $e==""){ $sql = $sql." b >='%s' order by b DESC,a"; $query = sprintf("$sql", mysql_real_escape_string($b)); // Cだけの場合 }else if( $a == "" and $b == "" and $d=="" and $e==""){ $sql = $sql." c <='%s' order by b DESC,a"; . . . // SQL クエリを実行する $result = mysql_query($query); よろしくご教授願います。

    • ベストアンサー
    • MySQL
  • SQLでレコードの抽出

    MySQLです。 商品IDと販売先、管理番号が、判明しているとき、 最大商品IDとそのレコードを取得するには、 どのようなSQLを書けば、よろしいでしょうか? select *, ? from SYOUHIN WHERE ???? テーブル例) ↓ユニーク 商品ID 販売先 管理番号  販売日 1   A社   1     2015-07-10 2   A社   2     2015-07-12 3   B社   1     2015-06-30 4   B社   2     2015-07-06 5   C社   1     2015-04-21

    • ベストアンサー
    • MySQL
  • SQL文でデータを抽出できない。

    現行のSQL文でACCESSからデータを抽出してきていたのですが、それでは問題が起きてしまったので、以下の内容にSQLを変更したいのですが、思うようにできません。 詳しい方がいましたらご教授願います。 お手数ですが、困っているのでよろしくお願いいたします。 *現行のSQL* 日付が最も若いものでかつ、IDとSUBJECTに重複のない データを抽出する。 "SELECT .sID,B.subject,B.D_time FROM (SELECT sID,Min(D_time) AS mtime ,subject FROM Reg1Data GROUP BY sID,subject) A INNER JOIN Reg1Data B ON A.sID=B.sID AND A.mtime=B.D_time GROUP BY B.sID,B.subject,B.D_time ORDER BY B.sID,B.subject;" *変更したいSQL* ある範囲の日付の中で(日付は、入力画面から抽出)日付が最も若いものでかつ、IDとSUBJECTに重複のないデータを抽出する。 "SELECT .sID,B.subject,B.D_time FROM (SELECT sID,Min(D_time) AS mtime ,subject FROM Reg1Data WHERE D_time <= & w_jyukobistart GROUP BY sID,subject) A INNER JOIN Reg1Data B ON A.sID=B.sID AND A.mtime=B.D_time GROUP BY B.sID,B.subject,B.D_time ORDER BY B.sID,B.subject;" 以上を実行すると、 [Microsoft][ODBC Microsoft Access Driver] クエリ式 'D_time <= & w_jyukobistart' の 構文エラー : 演算子がありません。 というエラーが出ます。 ちなみにw_jyukobistart はWEBの画面上に入力された抽出したいデータ範囲(from)です。 この変数の使い方に問題があるのか、それともSQL文自体に無理があるのか、最も良い方法をお尻の技術者の方、お答えいただけるとうれしいです。

  • SQL文について

    OracleやSQLについてはまだ初心者のレベルで理解が浅いので言葉足らずかもしれませんがよろしくお願いします。 以下のようなテーブル(名称:TBL)があったとします。 SHOP_CODE------SHOP_NUMBER----MONEY1------MONEY2 A ---------------- 1 ---------------- 100 ------------- 200 B ---------------- 2 ---------------- 300 ------------- 400 C ---------------- 3 ---------------- 500 ------------- 600 D ---------------- 4 ---------------- 700 ------------- 800 例えば、SHOP_CODEがA~Dのどれかの行(レコード)はそのまま抽出して、残った行(レコード)はMONEY1およびMONEY2を0に変更して抽出しようとした場合、 SELECT * FROM TBL WHERE SHOP_CODE = 'ここはA~Dのどれかを代入' UNION SELECT SHOP_CODE, SHOP_NUMBER, 0, 0 FROM TBL WHERE SHOP_CODE <> 'A~Dのどれかを代入' このようなSQL文を考えてみました。 しかし、比較的簡単な例ならばよいのですが、UNION前のSELECT文が複雑になってきた場合のことを考え以下のような文の作りかたができないかと思いました。 SELECT * FROM TBL WHERE SHOP_CODE = 'ここはA~Dのどれかを代入'・・・『この時点で抽出した塊になんらかの名称をつける(例:tbl)』 UNION SELECT SHOP_CODE, SHOP_NUMBER, 0, 0 FROM TBL WHERE SHOP_CODE <> tbl.SHOP_CODE・・・『このようにUNION以前に抽出した塊の名称を利用して条件を作成』 このような方法ができるとした場合、前段階で抽出した塊にどのような方法で名称をつけるのか分かりませんでした。(汗)そもそもできるかどうかもわかりませんが、、、(^^; 最初のSQL文がベターな方法なのかも分かりませんが、上記に示した方法で抽出することが可能でしょうか?もしできるのならば、前述したように名称をつけて条件を作成する方法等を教えていただきたいと思います。 おおよそ話を分かっていただければよいのですが、ものすごく簡単に言うと一つのテーブルのある行とある行に別々の処理をして再構成したいというようなイメージです。(今回はMONEYを0にすると仮定しました) できれば上記の方法に沿った考えで回答をいただけると私も助かりますが、もっと良い方法があれば是非伺いたいと思います。お時間の方ありましたらよろしくお願いします。

  • SQLにて順列の抽出

    MySQLにてSELECT文にて順列の抽出をしようと試みていますが、順列を出すためのSQL文がわからず困っています。 TABLE1 +-----+-----+-----+-----+ | NUM | A | B | C | +-----+-----+-----+-----+ | 101 | 0 | 4 | 9 | +-----+-----+-----+-----+ | 102 | 2 | 2 | 0 | +-----+-----+-----+-----+ 例えば上記の様なテーブルがあって、NUM=101のA,B,Cを取り出して 049 094 409 490 904 940 のような順列を作り出してPHPから渡した変数D(仮にvar=409)と照らし合わせようと試みていますが、1つの行の中の数字で順列を抽出するSQL文がわからず困っていますので、ご教授願います。

    • ベストアンサー
    • MySQL
プリントできない
このQ&Aのポイント
  • 購入後、2年ほど経ちますが、アイホン、iPadから印刷できません。ピクセルのスマホでは印刷が出来るのですが、ほかでは今まで出来ずに質問させていただきます。返答お待ちしています。
  • 製品名:dcp-j577n|お困りの内容:アイホン、iPadから印刷できません。ピクセルのスマホでは印刷が出来るのに、ほかではできません。
  • 購入後、2年ほど経ちますが、アイホン、iPadから印刷できません。機種の選択ができていないままです。ネットワークの接続ができず、問題が発生しています。
回答を見る