• ベストアンサー
  • 困ってます

複数のテーブルから値を合計出力するSQLについて

複数のテーブルから値を合計出力するSQLについて 以下の様な3つのテーブルがあり、それぞれのテーブルから値を合計した結果を取得したいと思っております。 この場合のSQL文をご教授いただけないでしょうか? 拙い説明でお分かりに難いかと思いますが、何卒、宜しくお願いします。 ●テーブル t1(テーブル1) id, 会員ID, 日付, 金額 t2(テーブル2) id, 会員ID, 日付, 金額 t3(テーブル3) id, 会員ID, 日付, 金額 ●期待する結果 上記、テーブル内の会員ID、日付が同じものの金額を合計して取得。(1行で出力) いずれかのテーブルに「会員ID」が一つしか存在しない場合も、「日付」、「金額」を取得して「合計金額」に反映。 もし、各テーブル、レコードの「金額」が「0」または「null」の場合は「0」として処理する。 ●期待出力結果イメージ 会員ID | 日付 | 合計金額 | -------------------------------- m001 | 2011/07/20 | 1500 | -------------------------------- m001 | 2011/06/10 | 2000 | -------------------------------- m002 | 2011/06/05 | 1000 | -------------------------------- m003 | 2011/05/25 | 0 | -------------------------------- m001 | 2011/03/05 | 3000 | ※「合計金額」は、「t1(テーブル1)」~「t3(テーブル3)」の中に含まれていた金額の合計。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数4960
  • ありがとう数4

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

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

UNIONでt1,t2,t3でテーブルを1個に結合して Group ByすればOK? 「金額」が「0」または「null」の場合は「0」はNVLで対応 Select 会員ID, 日付, NVL(SUM(金額),0) AS 合計金額 From ( Select 会員ID, 日付, 金額 From t1 UNION ALL Select 会員ID, 日付, 金額 From t2 UNION ALL Select 会員ID, 日付, 金額 From t3 ) Group By 会員ID, 日付

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早々のご回答有難う御座います!! 試したところ、上手くいきました!!! SQLの知識(だけではないですが(汗))が乏しく、全く思いつきませんでした。 本当に有難う御座いました。

関連するQ&A

  • 複数テーブルから値を連結出力するSQLについて

    以下の様な3つのテーブルがあり、それぞれのテーブルを連結して結果を取得したいと思っております。 この場合のSQL文をご教授いただけないでしょうか? 拙い説明でお分かりに難いかと思いますが、何卒、宜しくお願いします。 ●テーブル T1(科目テーブル) 科目ID, 科目名 T2(生徒テーブル) 生徒ID, 生徒名 T3(科目選択テーブル) 科目ID, 生徒ID(科目ID, 生徒IDで連結キー) ●期待出力結果イメージ ※例1)生徒ID=1の場合 科目ID | 科目名 | 生徒ID | 生徒名 ------------------------------------- 1 | 国語 | 1 | 山田太郎 ------------------------------------- 2 | 算数 | 1 | 山田太郎 ------------------------------------- 3 | 理科 | null | null ------------------------------------- 4 | 社会 | null | null ------------------------------------- 5 | 英語 | 1 | 山田太郎 ※例2)生徒ID=2の場合 科目ID | 科目名 | 生徒ID | 生徒名 ------------------------------------- 1 | 国語 | null | null ------------------------------------- 2 | 算数 | null | null ------------------------------------- 3 | 理科 | null | null ------------------------------------- 4 | 社会 | null | null ------------------------------------- 5 | 英語 | 2 | 鈴木花子 ●出力条件 科目テーブルの科目ID, 科目名は全て表示する。 T3(科目選択テーブル)に存在する生徒IDがあれば、その生徒ID、生徒名を表示する。 存在しない場合は、それぞれ「null」として表示する。 出力は生徒IDを条件とする。 何卒、宜しくお願いします。 ※因みに使用DBはMySQL5.1.44です。

    • ベストアンサー
    • MySQL
  • SQL文 合計と、特定の値を取り出す

    テーブル名:料金表 ID  項目CD  金額 ------------------------- 1   101   1000 1   102   2000  1   103    100 2   101   1000 2   102   2000 2   103    50 3   101   1000 3   102   2000 上記のテーブルがあります IDと、金額の合計と、項目CDが103のものだけ金額をだしたいのです 理想SELECT結果 ID  合計  項目CD:103 ------------------------- 1   3100   100 2   3050    50 3   3000    0(もしくはnull)  select ID,sum(金額) as 合計 from 料金表 where ID in(1,2,3) group by ID,金額 でIDと合計までは出せました 特定の項目の値を取り出すのはどうしたらいいでしょうか?

  • 複数テーブルを合わせて総合ランキングを作りたいです

    以下の2つの相性テーブル(table_a,table_b)でサブクエリーを使わず期待する結果(ランキング)を得るSQLはあるでしょうか? 又、両方とも1万件になった場合結構重いでしょうか?うーん、1つのテーブルにした方が良いですか。。 ■table_a user match_user point test1 test2 2 test1 test3 2 ■table_b user_id match_user_id point test1 test2 2 test1 test3 4 ■期待する結果 総合マッチランキング 1. test3 (6point) 2. test2 (4point)

    • ベストアンサー
    • MySQL

その他の回答 (2)

  • 回答No.3

mysql はインラインビューに明示的に別名をつけないといけないようですね。 SELECT t.会員ID, t.日付, SUM(t.金額) 合計金額 FROM ( SELECT 会員ID, 日付, 金額 FROM t1 UNION ALL SELECT 会員ID, 日付, 金額 FROM t2 UNION ALL SELECT 会員ID, 日付, 金額 FROM t3 ) t GROUP BY 会員ID, 日付;

共感・感謝の気持ちを伝えよう!

質問者からのお礼

度々のご教授、有難う御座います!!! また、何かあれば投稿させていただきます。 ご面倒お掛けいたしました。

  • 回答No.2

mysqlのバージョンにもよりますが SELECT 会員ID, 日付, SUM(金額) 合計金額 FROM ( SELECT 会員ID, 日付, 金額 FROM t1 UNION ALL SELECT 会員ID, 日付, 金額 FROM t2 UNION ALL SELECT 会員ID, 日付, 金額 FROM t3 ) GROUP BY 会員ID, 日付;

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早々のご教授、ご親切に有難う御座います!! nora1962のご回答も、参考にさせていただきます。

関連するQ&A

  • SQLの書き方がわかりません

    下記テーブルが access上にあります。 t1 ID 日付 01 2011/8/1 01 2011/9/1 02 2011/3/1 03 2011/5/30 t2 ID 日付 01 2011/7/1 01 2011/7/30 01 2011/8/1 01 2011/8/2 01 2011/9/2 02 2011/2/11 02 2011/3/1 02 2011/8/1 03 2011/4/30 03 2011/5/29 03 2011/6/30 このデータからt1を元に ID 日付1 日付2 01 2011/8/1 2011/8/1 01 2011/9/1 2011/8/2 02 2011/3/1 2011/3/1 03 2011/5/30 2011/5/29 というデータを取得するにはどのようなSQLを書けばよいでしょうか。 具体的にはt1とt2のIDが同じで、 t2の日付がt1の日付以下で最大のレコードと紐付けたいのです。

  • 2つのテーブルでの集計2

    昨日解決したかと思ったのですが、また出来ないことが出てきたので 同じようなタイトルで再度質問に参りました。 以下のようなテーブルがあるとして、 ● T1 名前|A_id|B_id| AAAA|1111|----| BBBB|----|2222| CCCC|3333|4444| ● T2 id|A_id|金額 01|1111|2000 02|3333|1000 03|1111|4000 ● T3 id|B_id|金額 01|2222|2000 02|4444|4000 ● 抽出結果でやりたいこと →SUM(A_idの金額)とSUM(B_idの金額)を足した金額が5000以上のみ抽出 かつ、T2とT3のid(通し番号)はグループ化せずに個々で出す 名前|A_id|B_id|A金額|B金額|横の合計| AAAA|1111|----|6000 |-----|6000 idはT2:01/03 CCCC|3333|4444|1000 |4000 |5000 idはT2:02/T3:02 表の作成はOKなのですが、個々のデータのidがグループ化してしまって どのデータから参照しているのかわからない状態になってしまいます 抽出結果に応じたidのデータに出力された日付を書き込みたいのですが、 今の状態ですと1つ分にしか書き込みされません… 全く同じ条件下でT2、T3個々のデータのidを全件取り出すことは可能でしょうか??アドバイス宜しくお願いします。。。 MySQL クライアントのバージョン: 5.0.45

    • ベストアンサー
    • MySQL
  • SQLでデータを1件だけ取得したいのですが。

    SQLでデータを1件だけ取得したいのですが。 以下のようなテーブルが2つあるとします。 ------------------------------------ テーブルA     テーブルB   値X           値X    値Y   1           1    20   2           2    NULL   3           2    60   4           2    70               4    NULL               4    NULL ------------------------------------ ここで、テーブルAの値Xと、テーブルBの値Xをリンクさせます。 テーブルAにデータがあれば、テーブルBに無くても出力します(外部結合イメージ) テーブルAの値Xに対して、テーブルBの値Xは2件以上リンクされる可能性があります。 この場合は1件のみ出力します。 その1件の決め方は、テーブルBの値YがNULLでは無く最大の物です。 但し値Yは全てNULLの可能性もあるので、その場合NULLとして1件出力します。 上記の出力イメージ ------------------------------------  値X    値Y  1    20  (1件の場合そのまま出力。1件がNULLでもそのまま出力)  2    70  (NULLではない最大の1件を出力)  3    NULL  (テーブルBになくても出力)  4    NULL  (値が全てNULLの場合、NULLとして1件出力) ------------------------------------ どのようなSQLを記載すれば実現可能でしょうか?

  • 複数のテーブルに対してのleft join

    前回他の方が質問していますが、、、 T1、T2、T3、T4がありまして T1が軸のテーブルです。 その場合 select T1.a,T2.b,T3.c from T1,T2,T3 left join T4 on T1.x = T2.x and T2.xx = T3.xx and T2.xxx = T4.xxx where T4.x is null というふうなSQLを発行しようとしたのです。 しかし「onが無効」と怒られました。 ご存知の方教えてください。 HPなどご存知の方お願いいたします。 DB2/UDBです。

  • 複雑なSQL文について

    SQLite バージョン3.7.10 を使用しています。 以下のサイトにソースがあります。 http://ideone.com/7FPtHL どう説明するのが適切なのかあまり分かりませんが、 よろしくお願い致します。 t5テーブルにおいて t2テーブルのt1_key1が't1_key_1' かつ t5テーブルのt3_keyに対応するt3テーブルのt1_keyに対応するt2テーブルのt1_key2の 例えば2012年1月の (t5テーブルのprofit × その日(t5テーブルのdateの日の部分)に対応した2テーブルのrate) を t4テーブルのkeyごとにグループ化してその合計値を高い順に出力したいのですが、 のですがどのようなSQL文を書けば良いのでしょうか? ※ ただし、もしt5テーブルのdateに対応する日付がt2テーブルのdateにない場合は、 t5テーブルのdateに対応する月(年も含めて)のt2テーブルのrateの平均値、 それもない場合は、t5テーブルのdateに対応する年のt2テーブルのrateの平均値、 それもない場合は、t5テーブルの全てのrateの平均値、 を取得してt5テーブルのprofitにかけたいのです。。 ※ 例えばこのデータなら 2012年1月は +----------+------+ | t4_name  | sum | +----------+------+ | t4_name_1 |500000| +----------+------+ | t4_name_2 |150000| +----------+------+ という結果が得たいです。 t5テーブルのdateの'2012-01-03 00:00:02'の日付に対応するt2テーブルのdateは存在しないので、 t2テーブルの1月(2012-01)のrateの平均値((100+200+300)/3=200)を profitにかけています。 複雑すぎるというか自分でもうまく説明できないので、 せめて※の部分のSQLの書き方だけでもアドバイス頂けないでしょうか?

  • テーブルのOR外部結合2

    テーブル内容 TBL1 T1_ID T1_NM 100  T1_1 101  T1_2 102  T1_3 103  T1_4 ---------- TBL2 T1_ID T2_ID T2_NM 100  100  T2_1 101  101  T2_2 101  102  T2_3 102  103  T2_4 ---------- TBL3 T3_ID T3_TYPE T3_NM 100  T1    T3_1 100  T2    T3_2 101  T1    T3_3 101  T2    T3_4 102  T1    T3_5 102  T2    T3_6 ---------- 要求出力結果 T1_NM  T2_NM  T3_NM T1_1          T3_1 T1_1   T2_1    T3_2 T1_2          T3_3        T1_2   T2_2    T3_4 T1_2   T2_3    T3_5 T1_3          T3_6 T1_3   T2_4 T1_4 以上のデータ内容で要求出力結果を得たいです。 各テーブルの結合条件としては (T1.T1_ID = T2.T2_ID)(+) AND ( (T1.T1_ID = (T3.T3_ID AND (T3.T3_TYPE = 'T1')(+)) OR (T2.T2_ID = (T3.T3_ID AND (T3.T3_TYPE = 'T2')(+)) ) となります。 もちろんこのままだと外部結合の中にORがあるのでエラーとなります。 UNIONを使用せずに実現できますでしょうか?

  • DELPHIでSQLテーブルを読み込み・編集・削除したい

    DELPHI6を使っております。素人です。 以下のようなプログラムを書きたいと思っておりますが、 参考書やネットで調べても以下の作業ができません。 SQLテーブルに a_tbl というテーブルをつくり、 a_id varchar2 (一意) a_namae varchar2 a_kubun varchar2 という項目を作りました。 delphiでは、editboxを設置して、それぞれ edit1, edit2, edit3という名前をつけました。 また、ボタン1、2を設置しました。 行いたい作業は以下です。 ・edit1に値を入力し、ボタン1をクリックする ・「a_id」に格納されている値と、「edit1」に入力した文字とが一致するところの「a_namae」を「edit2」に、「a_kubun」を「edit3」に表示させる ・edit3に表示した文字を変えて、ボタンをクリックすると「a_kubun」が 上書きされる ・「a_id」に格納されている値と、「edit1」に入力した文字とが一致する ものがない場合、edit2と3に入力してボタン2をクリックすることで 新規に「a_tbl」にレコードが記入される 教えてください!

  • SQLでの集計について

    こんにちわ。以下のようなテーブルから条件に見合う合計を出したいと思いSQLを書いてみたのですが、 思った結果になりません。 テーブルA ID1 得意先Cd 営業所Cd 日付 1  001    001  2005/09/01 2  001    002  2005/09/01 3  001    001  2005/09/03 テーブルB ID2 ID1 部署 数量 金額 1  1  01  1  1000 2  1  01  1  1000 3  1  02  1  1000 4  2  01  1  1000 5  2  01  1  1000 6  3  01  1  1000 7  3  01  1  1000 8  3  02  1  1000 [抽出結果] 得意先Cd 営業所Cd 日付  部署 数量(Sum) 金額(Sum) 001    001  2005/09/01 01   2   2000 001    001  2005/09/01 02   1   1000 001    001  2005/09/03 01   2   2000 001    001  2005/09/03 02   1   1000 001    002  2005/09/01 01   2   2000 [SQL] select 得意先Cd,営業所Cd,日付,部署,SUM(数量) As '数量計',SUM(金額) As '金額計' from テーブルA AA Inner join テーブルB BB ON (AA.ID1 = BB.ID1) group by 得意先Cd,営業所Cd,日付,部署,数量,金額 order by 得意先Cd,営業所Cd,日付,部署 このSQLを実行すると、日付、部署共に同じ場合でも数量・金額が合計値となりません。 得意先Cd 営業所Cd 日付  部署 数量 金額 001    001  2005/09/01 01 1  1000 001    001  2005/09/01 01 1  1000 どのように変更を加えれば、上記の「抽出結果」にできるのでしょうか? よろしくお願いいたします。

  • SQL,値の大きい順に値を取得

    質問させて頂きます。 DB:PostgresSQL 言語:PHP 現在仕事情報の入ったテーブルから、金額の高い順にデータを10件取り出したいと考えています。 金額の入ったカラムが1つであれば、order by句で取り出すのですが、今回、時給[hour]、月給[month]、年収[year]と3つのカラムが存在しています。 ※下記のid4のように2つ以上の金額情報カラムを持っているデータも存在します。 ※データの中にはnullでなく0が入っているデータも存在します。 [id][hour][month][year] 1 ,1000 ,null ,null 2 ,1200 ,0 ,0 3 ,null ,300000 ,null 4 ,1500 ,200000 ,null 5 ,null ,null ,3200000 ... 100,null ,250000 ,null 質問の内容なのですが、下記のルールに従いデータを取得する際、どのような方法を行えば一番効率的でしょうか。 「ルール」 1. 金額比較の際、 月給はそのまま、 年収は12で割った金額、 時給に関しては、時給×8(1日の平均的労働時間)×20(1月の平均的な労働日数)の金額とします。 2. 2つ以上のカラムに金額を持っていた際は(id4のようなデータ)、金額の大きさに関わらず、年収>月給>時給の順で取得する。 id4のデータならば、時給の方が月給より高いですが、月給のデータを使用します。年収があれば年収優先。 id2の場合、0はnullと同じ扱いと考え、時給のデータを使用します。 このルールをふまえたうえでデータを取得する際、SQLで全データを取得して、PHPで高い順を判定するべきか、SQLで取得する時点である程度絞って取得した方が良いのか・・・。 SQLに関しての知識が乏しいため、効率的な方法をご存知の方はアドバイス頂けると大変助かります。 よろしくお願いします。

  • SQL文について

    SQLite バージョン3.7.10 を使用しています。 次のようなテーブル構造で、 PRAGMA foreign_keys = ON; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t2 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t2 (key, name) VALUES ('t2_key1', 't2_name1'); INSERT INTO t2 (key, name) VALUES ('t2_key2', 't2_name2'); CREATE TABLE t3 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t3 (key, name) VALUES ('t3_key1', 't3_name1'); INSERT INTO t3 (key, name) VALUES ('t3_key2', 't3_name2'); CREATE TABLE t4 ( year TEXT NOT NULL, t1_key TEXT NOT NULL, t3_key TEXT NOT NULL, percent INTEGER NOT NULL, UNIQUE(year, t1_key, t3_key), FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2011', 't1_key1', 't3_key1', 10); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key2', 50); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key1', 100); CREATE TABLE t5 ( no INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL, t1_key TEXT NOT NULL, t2_key TEXT NOT NULL, t3_key TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t2_key) REFERENCES t2(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-01-01', 't1_key1', 't2_key1', 't3_key1', 3000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-02-02', 't1_key2', 't2_key1', 't3_key1', 2000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2012-01-01', 't1_key2', 't2_key1', 't3_key1', 5000); 例えばテーブル「t5」から、 dateカラム=’2011’ t1_keyカラム= (テーブル「t1」のt1_nameカラム=’t1_name1’のt1_key1) t2_keyカラム= (テーブル「t2」のt2_nameカラム=’t2_name1’のt2_key1) という条件の含まれてる全ての対応する行に、 テーブル「t4」のpercentカラムとテーブル「t5」のamountカラムを 掛け合わせた数値の合計を出力する。 ただしテーブル「t4」に対応するt1_keyとt3_keyがなければ、 percentを「0」としてamountと掛ける。 例えばこの条件だと '2011-01-01'と'2011-02-02'の2つの行のamountの合計を求めることになりますが、 '2011-01-01'の方は、テーブル「t4」にpercent「10」があるので 3000×(10/100)=300 '2011-02-02'の方は、テーブル「t4」にpercentがない(対応する行がない)ので 2000×(0/100)=0 合計 300+0=300 という結果が得たいです。 これはどのようなSQL文になるのでしょうか?