複数のテーブルから値を合計出力するSQL文

このQ&Aのポイント
  • 複数のテーブルから値を合計出力するためのSQL文をご教授いただけますか?
  • テーブル内の会員IDと日付が同じものの金額を合計して取得するSQL文を作成したいです。
  • 「会員ID」と「日付」が同じレコードの金額を合計して取得するためのSQL文をお願いします。
回答を見る
  • ベストアンサー

複数のテーブルから値を合計出力する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)」の中に含まれていた金額の合計。

  • jone
  • お礼率94% (18/19)
  • MySQL
  • 回答数3
  • ありがとう数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, 日付

jone
質問者

お礼

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

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答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, 日付;

jone
質問者

お礼

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

  • nora1962
  • ベストアンサー率60% (431/717)
回答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, 日付;

jone
質問者

お礼

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

関連する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と合計までは出せました 特定の項目の値を取り出すのはどうしたらいいでしょうか?

  • 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の日付以下で最大のレコードと紐付けたいのです。

  • 複数テーブルの結合

    マスターテーブル1つと、子テーブルが複数存在して子テーブルにはマスターテーブルのidを格納するフィールドがあり参照しなくなったときにはそのidを消去するといったデータベースがあったときにマスターIDごとに子テーブルのどれか1つでも参照していればカウントするみたいなSQLをつくりたいんですが select count(m.id) from master m inner join a on m.id = a.m_id inner join b on m.id = b.m_id inner join c on m.id = c.m_id group by m.id みたいなSQLだとAにデータが存在しなければB以降に存在しても期待した結果が出力されません。A、B、Cいずれかのm_idとマスター側のIDが等しければカウントするという出力をするためにはどのように書けばいいんでしょうか。 わかりづらい説明で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 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文 合計値を出力する

    ID  項目CD  評価結果 ------------------------- A   1-1-1   ○ A   1-1-1   ○ B   1-1-1   × C   1-1-1   ○ A   1-2-1   ○ A   1-2-1   ○  B   1-2-1   ○ C   1-2-1   〇 上記のテーブルがあります 評価結果は、○と×があり、項目CDごとに集計を行い、項目CDが同じ場合は、○がいつくあっても1とみなして計算するということをおこないたいです 理想SELECT結果 ID  合計  -------------- A   2   (1-1-1で○が2つあるが、1つとして計算) B   1    C   2     SELECT ID,SUM(評価結果) FROM TABLE GROUP BY ID でIDと合計までは出せました 現在のSELECT結果 ID  合計  -------------- A   4   (すべての○の合計を出力) B   1    C   2   項目CDが同じ場合"○"を1つとして集計するにはどうすればいいのでしょか?

  • SQLを教えて下さい

    SQL server 2008 R2 と VB2010 で開発を行っています。 いま、月別の合計金額を計算するSQLがわからなくて困っています。 【売上明細テーブル】 ・明細ID ・年月日 ・得意先ID ・売上金額 出力したい内容は以下のような月別売上合計の推移です。 具体的にはこんな感じです。 得意先ID 3月売上 4月売上 5月売上 --------------------------------------- 0001     1,111   2,222   3,333 0002     2,222   3,333   4,444 0003     5,555     0    6,666 得意先の中には売上の無い月もあります(0003の4月)が、 この場合も一覧に出したいと考えています。 1つのロウの中に異なる条件の値がある場合のSQLの組み立てがわかりません。 どうぞ宜しくお願いします。

  • あるテーブルの内容を基準にして違うテーブルを更新するSQL文

    教えて下さい。 あるテーブルに下記の内容があります。 ID│名称 ─┼─── 1│花 2│木 3│水 もうひとつのテーブルには、 ID│名称 ─┼─── 1│海 3│水 4│空 となっています。 最初のテーブルの全レコードを対象に、最初のテーブルのIDと同じ値がもうひとつの テーブルにある場合、もうひとつのテーブルをUPDATEし、存在しなければINSERTしたい です。 結果を ID│名称 ─┼─── 1|花 2│木 3│水 4│空 を期待しています。 このようにするSQL文を教えていただけませんでしょうか。 よろしくお願いします。

  • 更新クエリで合計金額を入れたい

    アクセスのテーブル1を作成しました。 ID    日付    金額    合計金額 1     6/1     ¥100 2     6/1     ¥200 3     6/2     ¥150 4     6/2     ¥300 (合計金額はカラ) そして、日別の合計を出すクエリ1を作成しました。 SELECT [テーブル1].日付, Sum([テーブル1].金額) AS 金額の合計 FROM テーブル1 GROUP BY [テーブル1].日付; 元のテーブルの合計金額の列に、クエリで表示した金額の合計を更新クエリで入れようとすると、 「 更新可能なクエリであることが必要です。」となります。 更新クエリのSQL文は UPDATE クエリ1 INNER JOIN テーブル1 ON [クエリ1].日付 = [テーブル1].日付 SET [テーブル1].合計金額 = [クエリ1]![金額の合計]; です。 ヘルプの内容の 一対多リレーションシップの '一' 側のフィールドを更新するクエリを実行しようとしました。 読み取り専用で開いているデータベースのクエリで、古い OpenQueryDef メソッドで使用しています。 には該当してないのですが(リレーションシップを組んでないし、四方チリ専用で開いてないし) どうすれば元のテーブルに合計金額を入れられるのでしょうか? 結果的に ID     日付     金額     合計金額 1     6/1     ¥100     300 2     6/1     ¥200     300 3     6/2     ¥150     450 4     6/2     ¥300     450 にしたいです。

  • 複数のテーブルを参照して値を変更する方法

    お世話になっております。 以下のようなテーブルがあったとして、table1,table2の値を参照して加算し、master_tableの値を変更するようなSQLは一つの文で書く方法はありますでしょうか? 例えば、あるSQLを実行すると、master_tableのid1のscoreが500になるようなSQLです。 どなたかご教授ください。 master_table id | score 1 | 0 2 | 0 table1 id | score 1 | 100 2 | 300 table2 id | score 1 | 400 2 | 100

    • ベストアンサー
    • MySQL