質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • SQL

    3081questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • PostgreSQL

    1392questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

整形後の複数SELECT文を一つの表にまとめる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 135

inu_inu

score 9

お世話になっております。
よろしくお願いします。

やりたいこと

複数のテーブルからSELECTした結果を合わせて一つにまとめた表を出力するビューを作成したいです。

下記のような二つSQLで複数テーブルからデータを抽出した後、ID・year・monthを基準として一つの表にまとめたいと考えています。

--SQL1:テーブル"TABLE0"からID・year・monthを基準にstatus=1のレコード数をカウントする
SELECT tbl1.ID
      ,tbl1.year
      ,tbl1.month
      ,sum(CASE tbl1.status WHEN 1 THEN 1 ELSE 0 END) AS count_status
FROM (
       SELECT tbl0.ID
      ,extract(YEAR FROM tbl0.ts) AS year
      ,extract(MONTH FROM tbl0.ts) AS month
      ,tbl0.status
       FROM TABLE0 tbl0
     ) AS tbl1
WHERE tbl1.status = 1
GROUP BY tbl1.ID,tbl1.year,tbl1.month
ORDER BY tbl1.ID,tbl1.year,tbl1.month;
--テーブル"TABLE_A"からID・year・monthを基準にNumber1=1,2,3のレコード数をカウント
--テーブル"TABLE_B"からID・year・monthを基準にNumber2=12のレコード数をカウント
--上記実現のために、それぞれの条件でUNION後にカウント
SELECT tblA.ID
      ,tblA.year
      ,tblA.month
      ,sum(CASE tblA.number WHEN 1 THEN 1 ELSE 0 END) AS count_1
      ,sum(CASE tblA.number WHEN 2 THEN 1 ELSE 0 END) AS count_2
      ,sum(CASE tblA.number WHEN 3 THEN 1 ELSE 0 END) AS count_3
      ,sum(CASE tblA.number WHEN 12 THEN 1 ELSE 0 END) AS count_12
FROM (
       SELECT tbla.ID
             ,extract(YEAR FROM tbla.timestamp) AS year
             ,extract(MONTH FROM tbla.timestamp) AS month
             ,tbla.Number1 AS number
       FROM TABLE_A tbla
       WHERE tbla.Number1 in (1,2,3)
       UNION ALL 
       SELECT tblb.ID
             ,extract(YEAR FROM tblb.timestamp) AS year
             ,extract(MONTH FROM tblb.timestamp) AS month
             ,tblb.Number2
       FROM TABLE_B tblb
       WHERE tblb.Number2 = 12
     ) AS tblA
GROUP BY tblA.ID,tblA.year,tblA.month
ORDER BY tblA.ID,tblA.year,tblA.month;

試そうとしたこと

"LEFT JOIN"で一つ目のSQL結果に二つ目のSQL結果を結合しようと考えましたが、LEFT JOIN ON ○○ = ●●を書く段階で、どうやって記載すればいいかわからなくなってしまいました。
(二つ目のSQLですでに複数テーブルをUNIONしてtblAとエイリアスをつけているため)

先週質問させていただいた内容の質問からあまり時間がたっておらず、非常に力不足を実感いたします。。
ご参考となる一言でも構いませんので、ご助力いただけますと幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

on は、1つ目のTableと2つ目のTableを繋ぐ際に、どのColumnをキーにしてつなげればいいか、という事ですよ。
1つにまとめる時に「1つ目のTableのこの値が2つ目のTableのこの値と一致するものでまとめよう」と考えますよね?
その2つのColumnを書けばいいだけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/25 16:09

    記載漏れていましたが、一度のSQLで複数のテーブルからSELECTした結果を合わせて一つにまとめた表を出力するビューを作成したいと思っています。
    kunai様のおっしゃる通り、
    LEFT JOIN ON tbl1.ID = tblA.ID
    AND tbl1.year = tablA.year
    AND tbl1.month= tablA.month
    が必要ということはわかるのですが、tblAは二つ目のSQLの結果付与したエイリアスとなるため、二つ目のSQL自体をどこに組み込めばいいのかがわかっていない状況です。。

    キャンセル

  • 2019/02/25 16:22

    LEFT JOIN テーブル名 ON ~
    のテーブル名部分にSELECTを記載すればいいですかね、試してみたいと思います。

    キャンセル

  • 2019/02/25 17:06

    テーブル名部分へ記載した後、GROUP BYの指定で少々躓きましたが、無事に出力することができました!ありがとうございました。

    キャンセル

+1

端的な説明をすると、以下のようになれば良いと思いますが。

select Q1.*
     , Q2.count_1, Q2.count_2, Q2.count_3, Q2.count_12
from (一つ目のSQL) Q1
     left join (二つ目のSQL) Q2
     on  Q1.ID = Q2.ID
     AND Q1.year = Q2.year
     AND Q1.month= Q2.month
ORDER BY Q1.ID, Q1.year, Q1.month


※それぞれのSQLでのorder byは不要です。
性能的なところでは分解した方が良いかもしれませんけど、それも実行計画次第ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/25 17:10

    ご提示いただいたLEFT JOINのテーブル指定部分にSELECTを記載することで無事に出力することができました!
    GROUP BYの指定で少々躓きましたので意味合いについてもっと理解を深めたいと思います。
    BAについては、kunai様のご助言でピンと来て作成できたため、非常に申し訳ありませんがkunai様をBAとさせていただきました。
    sazi様のご回答で答え合わせができたため、非常に参考になったことに変わりはありません。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • SQL

    3081questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • PostgreSQL

    1392questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。