SQLデータベースの売上実績を取得する方法とNull値の処理方法について

このQ&Aのポイント
  • VB2010とSQL Server2008 R2を使用している場合、担当者テーブルと売上明細テーブルから指定された期間の担当者別の売上実績を取得する方法を教えてください。
  • また、売上がなかった担当者も含めて全ての担当者の一覧を取得したい場合、Null値が列に表示されてしまうため、これをゼロに置き換える方法を教えてください。
回答を見る
  • ベストアンサー

SQLについて質問します

VB2010 とSQL Server2008 R2 で開発をしています。 担当者テーブル(table_tanto)と売上明細テーブル(table_uriage_meisai)があります。 各テーブルのカラムは以下です。 table_tanto ・tanto_id ・tanto_name table_uriage_meisai ・meisai_id ・tanto_id ・kingaku ・date ある期間の担当者別の売上実績を一覧で出力したいと考えています。 「table_uriage_meisai」の「date」で範囲指定したいと思います。 結果はこんな形を望んでいます。 担当者ID 担当者名 売上合計 0001   ○○○   ****** 0002   □□□      0 0003   △△△   ****** 0004   ●●●   ****** 2点質問があります。 売上の無かった担当者も含めてすべての担当者の一覧を出したいと考えています。 そのSQlがわからないのと、売上がなかった担当者はその列がNullになってしまうと思うんですが、後の計算で困ります。 Nullのときゼロを返すようにするにはどうしたらよいでしょうか。 以上2点について教えて下さい。 よろしくお願いします。

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

  • ベストアンサー
  • stork
  • ベストアンサー率34% (97/285)
回答No.3

結合キーを揃えて集計したものと 担当者テーブルを結合させます select 担当.tanto_id as 担当者ID ,担当.tanto_name as 担当者名 ,isnull(売上.売上合計,0) as 売上合計 --null処理 from table_tanto as 担当 left outer join ( select tanto_id,sum(kingaku) as 売上合計 --集計 from table_uriage_meisai where date between '2010/11/01' and '2010/11/30' --範囲指定 group by tanto_id --集計 ) as 売上 on 担当.tanto_id = 売上.tanto_id コピペして見やすいようにタブを入れて見て下さい。

その他の回答 (2)

  • cotae_bb
  • ベストアンサー率53% (51/95)
回答No.2

A1. inner join や left outer join などで2つのテーブルを結合できます。 例) select  T1.tantou_id  ,T2.meisai_id from  table_tantou T1  left outer join  table_uriage_meisai T2  on   T1.tantou_id = T2.tatou_id A2. isnull を使うことでNULL値が入っている場合の回避処理が行えます。 例) select  isnull(kingaku, 0) from  table_uriage_meisai

  • Kazma_hk
  • ベストアンサー率26% (115/428)
回答No.1

SQL Serverとのことなので、 外部結合とIIFを調べると幸せになると思います。

関連するQ&A

  • SQL Server を使っています。SQLの質問です。

    SQL Server を使っています。SQLの質問です。 得意先テーブルと商品テーブルと売上明細テーブルがあります。 一つの商品に関して得意先ごとに最新の売上明細データの一覧を作成したいと考えて います。 ■売上明細データ 明細ID (meisai_id) 得意先ID (tokuisaki_id) 商品ID  (syohin_id) 売上金額(uriage_kingaku) 売上日 (uriage_date) ■売上明細データ(table_uri_maisai) meisai_id tokuisaki_id syohin_id uriage_kingaku uriage_date =================================================================   1     aaa     001     100     2010/01/01   2     aaa     002     200     2010/01/01   3     bbb     001     105     2010/01/02   4     bbb     002     205     2010/01/02   5     ccc     001     110     2010/01/03   6     ccc     002     210     2010/01/03   7     aaa     001     100     2010/01/04   8     aaa     002     200     2010/01/04   9     bbb     001     105     2010/01/05   10     bbb     002     205     2010/01/05   11     ccc     001     110     2010/01/06   12     ccc     002     210     2010/01/06 上のような明細があり、「syohin_id」が「001」のデータに関して、 得意先ごとの最新のデータだけを抽出したいと考えています。 この場合ですと、以下の3件のデータが抽出できればよいわけです。   7     aaa     001     100     2010/01/04   9     bbb     001     105     2010/01/05   11     ccc     001     110     2010/01/06 tokuisaki_id と syohin_id の2つを特定して1件のデータを抽出するには 以下のSQLで実現できましたが、syohin_id だけを指定して複数のデータを 出すことがどうしてもできません。 SELECT * FROM table_uri_meisai WHERE uriage_date = (select max(uriage_date) FROM table_uri_meisai WHERE tokuisaki_id = 1 AND syohin_id = 1) AND tokuisaki_id = 1 AND syohin_id = 1 どなたかご指導ください。 よろしくお願いします。

  • SQLの質問です。

    SQLの質問です。 SQL Server 2008 R2 を使っている初心者です。 下の2つのテーブルがあります。 1)売上情報 table_uriage ・uriage_id ・user_id ・uriage_date ・uriage_kingaku 2)入金情報 table_nyukin ・nyukin_id ・user_id ・nyukin_date ・nyukin_kingaku この2つのテーブルに対して、同じ期間を指定して、集計表(ユーザー毎の合計)を 作りたいと思っています。別々の表にするには何の問題もないのですが、 問題は2つのSQLの結果を1つの表にしたいのですが、SQLをどのように組んだらいいか わかりません。 具体的な表としては、 user_id uriage_total nyukin_total ======================================== 001 11111 22222 002 33333 44444 003 55555 66666 みたいな感じになればいいのです。 どなたか教えて下さい。 よろしくお願いいたします。

  • 集計のSQL文を教えてください

    集計で困っています。 助けてください。 uriage_date(date型) uriage_kingaku 2005/01/01 00:15   2000 2005/01/01 12:20   2500 2005/01/02 00:00   1000 ←ここは前日分(2005/01/01)に 2005/01/02 05:15   1800 2005/01/04 12:30   2300 ~ 2005/12/31 20:20   5000 2005/12/31 22:45   1200 上の様なテーブルから 売上合計(1月分) uriage_date     goukei_kingaku 2005/01/01      5500 2005/01/02      1800 2005/01/03      0 ~ 2005/01/31      9000 この様に1日毎(当日00:01~翌日00:00)の売上の合計金額 を一ヶ月単位で集計したいのですが、SQL文が解りません。 00:00の売上は前日の合計に入れたいです。 データの無い日も0円として欲しいです。 よろしくおねがいします。

  • SQLのSELECT文教えてください。

    VB5.0で、DBはSqlServer2000です。 SQL文のSELECT文で質問です。 ○A_TABLEの構成(概略) ・・・担当コード1・・・担当コード2 ○TANTO_TABLE 担当コード/担当名 (質問)TANTO_TABLEからA_TABLEの担当コード1と担当コード2の担当名を抽出したいのです。 次のSQLだと担当コード1のみしか抽出できません。 効率よく担当コード1と2の担当名を抽出するSQLを教えてください。お願いします。 SELECT 担当名 FROM A_TABLE,TANTO_TABLE WHERE A_TABLE.担当コード1 = TANTO_TABLE.担当コード

  • SQLがわかりません。その2

    VB2010とSQL Server2008 R2 でWindowsアプリを作っている新米です。 下のような表(DataDridView)で表示したいと考えています。(本当は月曜から金曜までの 5日間ですが、便宜上4日間で表現しました。) 品名ID 月曜 入荷 出荷 火曜 入荷 出荷 水曜 入荷 出荷 木曜 入荷 出荷 aaaaaa 6/12 2000 1500 6/13 1000 1000 6/14 1300 2000 6/15 3300 2000 bbbbbb 6/12 1000 2500 6/13 3000 4500 6/14 4200 3000 6/15 2000 1000 cccccc 6/12 1000 1500 6/13 1000 3400 6/14 1700 2600 6/15 3500 1000 dddddd 6/12 1500 1800 6/13 2200 1000 6/14 3300 1000 6/15 4100 2200  ・  ・ テーブル(table_meisai)はこのように構成されています。 meisai_id hinmei_id date in_suryo out_suryo したがって SELECT hinmei_id,date,in_suryo,out_suryo FROM table_meisai WHERE date BETWEEN 6/12 AND 6/16 とすると、当然のことながら aaaaaa 6/12 2000 1500 aaaaaa 6/13 1000 1000 aaaaaa 6/14 1300 2000 aaaaaa 6/15 3300 2000 aaaaaa 6/16 3200 3500 bbbbbb 6/12 1000 2500 bbbbbb 6/13 3000 4500  ・  ・ と出てきてしまうわけです。 で、これを上記のような「hinmei_id」単位で1行にした「表」にしたいと考えているのですが、 そのSQLがわからないという状況です。 SQLの組立て方法を教えて下さい。 よろしくお願いします。

  • 2件目のデータを取得する

    お世話になります。 データベース:SQLSERVER2005 テーブル名:URIAGE_TABLE 項目:URIAGE_CODE、URIAGE_DATE、URIAGE_KINGAKU 上記テーブルの、2件目のデータのみを取得 するSQL文をを知っている方いますか? どうぞ宜しくお願いします。

  • MySQLについてお願いします。

    下記の2つのテーブルより、各顧客が最後に売れた日を抽出したいのですがうまくいきません。 顧客テーブル kokyaku_id kokyaku_name 1 aaa 2 bbb 3 ccc 4 ddd 売上テーブル uriage_date kokyaku_id kingaku 2000-1-1 1 100 2011-12-1 2 200 2010-2-2 2 300 2009-3-1 1 50 2006-5-29 3 300 2007 3 400 2012-9-20 3 100 kokyaku_name | uriage_date aaa | 2009-3-1 bbb | 2011-12-1 ccc | 2012-9-20 顧客dddは売上がないので当然結果には出てこなくてOKです。 何結合でどのようなクエリにすればよろしいでしょうか。 まだDBを初めて2週間なので、ご教示お願い致します。

    • ベストアンサー
    • MySQL
  • SQLを教えて下さい。

    VB2010 と SQL Server 2008R2でWindowsアプリを作成しています。 以下に様なDataGridViewを作成したいと考えています。 品名ID 月曜 入荷 出荷 火曜 入荷 出荷 水曜 入荷 出荷 木曜 入荷 出荷 金曜 入荷 出荷 aaaaaa 6/12 2000 1500 6/13 1000 1000 6/14 1300 2000 6/15 3300 2000 6/16 3200 3500 bbbbbb 6/12 1000 2500 6/13 3000 4500 6/14 4200 3000 6/15 2000 1000 6/16 2000 2700 cccccc 6/12 1000 1500 6/13 1000 3400 6/14 1700 2600 6/15 3500 1000 6/16 2500 2200 dddddd 6/12 1500 1800 6/13 2200 1000 6/14 3300 1000 6/15 4100 2200 6/16 1000 1500  ・  ・ テーブルはこのように構成されています。 【table_meisai】 meisai_id hinmei_id date in_suryo out_suryo ですので、一遍にこのDataGridViewに表現するのは無理な感じです。 それで以下のように考えました。 1)「hinmei_id = aaaa」と「date between 6/12 and 6/16」を条件とした検索を行う。 2)1)の検索結果をテンポラリーテーブルに書き込む。 3)1)の検索を「hinmei_id = bbbbb」に変えて行う。 4)3)の結果をテンポラリーテーブルに書き込む。 5)3)と4)をすべての hinmei_id に対して行う。 6)作成されたテンポラリーテーブルに対して検索し、結果をDataGridViewに表示する。 というやり方でできるのではないかと考えています。 ですが、実際にSQLをどのように組み立てたらもいのかさっぱりわかりません。 ご指導下さい。 また、もしかしたら、上記の1)~6)のアプローチ自体が間違っているのかもしれません。 他の方法があったら教えて下さい。 よろしくお願い致します。

  • Ruby初心者です。

    以下の練習問題をやっているのですが、どうもうまくいきません。 (1)担当名が"end"になる迄、担当名と売上を入力する。 (2)売上合計を求める。 (3)各担当の売上が売上合計の何%になるかの比率の計算を行う。 (4)担当名、売上、比率を表示する。 どこがいけないのがご教授頂けますでしょうか。 よろしくお願い致します。 *********************************** #! ruby -E Windows-31J:utf-8 # coding: utf-8 kensu = 0 uriage = 0 goukei = 0 uriage_t = [20] tanto = [10] tanto = [20][10] puts("担当名がendで終了") print(kensu = kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") print("売上") uriage = $stdin.gets.chomp!.to_i while tanto != "end" kensu = kensu goukei = goukei + uriage uriage_t = uriage tanto_t = tanto print(kensu = kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") if tanto != "end" print("売上") uriage = $stdin.gets.chomp!.to_i end end kensu = kensu + 1 goukei = goukei + uriage uriage_t = uriage tanto_t = tanto, "合計" puts "________________________________________" puts "  担当      売上  比率  " puts "________________________________________" for i in kensu kensu += i ritu = uriage * 100 / goukei puts "担当名は#{tanto} 売上は#{uriage_t}円 比率は#{ritu}%" end

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???