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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

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

SQL

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

Q&A

解決済

2回答

1360閲覧

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

inu_inu

総合スコア19

PostgreSQL

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

SQL

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

0グッド

0クリップ

投稿2019/02/25 06:51

編集2019/02/25 07:06

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

やりたいこと

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

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

SQL

1--SQL1:テーブル"TABLE0"からID・year・monthを基準にstatus=1のレコード数をカウントする 2SELECT tbl1.ID 3 ,tbl1.year 4 ,tbl1.month 5 ,sum(CASE tbl1.status WHEN 1 THEN 1 ELSE 0 END) AS count_status 6FROM ( 7 SELECT tbl0.ID 8 ,extract(YEAR FROM tbl0.ts) AS year 9 ,extract(MONTH FROM tbl0.ts) AS month 10 ,tbl0.status 11 FROM TABLE0 tbl0 12 ) AS tbl1 13WHERE tbl1.status = 1 14GROUP BY tbl1.ID,tbl1.year,tbl1.month 15ORDER BY tbl1.ID,tbl1.year,tbl1.month;

SQL

1--テーブル"TABLE_A"からID・year・monthを基準にNumber1=1,2,3のレコード数をカウント 2--テーブル"TABLE_B"からID・year・monthを基準にNumber2=12のレコード数をカウント 3--上記実現のために、それぞれの条件でUNION後にカウント 4SELECT tblA.ID 5 ,tblA.year 6 ,tblA.month 7 ,sum(CASE tblA.number WHEN 1 THEN 1 ELSE 0 END) AS count_1 8 ,sum(CASE tblA.number WHEN 2 THEN 1 ELSE 0 END) AS count_2 9 ,sum(CASE tblA.number WHEN 3 THEN 1 ELSE 0 END) AS count_3 10 ,sum(CASE tblA.number WHEN 12 THEN 1 ELSE 0 END) AS count_12 11FROM ( 12 SELECT tbla.ID 13 ,extract(YEAR FROM tbla.timestamp) AS year 14 ,extract(MONTH FROM tbla.timestamp) AS month 15 ,tbla.Number1 AS number 16 FROM TABLE_A tbla 17 WHERE tbla.Number1 in (1,2,3) 18 UNION ALL 19 SELECT tblb.ID 20 ,extract(YEAR FROM tblb.timestamp) AS year 21 ,extract(MONTH FROM tblb.timestamp) AS month 22 ,tblb.Number2 23 FROM TABLE_B tblb 24 WHERE tblb.Number2 = 12 25 ) AS tblA 26GROUP BY tblA.ID,tblA.year,tblA.month 27ORDER BY tblA.ID,tblA.year,tblA.month; 28

試そうとしたこと

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

SQL

1select Q1.* 2 , Q2.count_1, Q2.count_2, Q2.count_3, Q2.count_12 3from (一つ目のSQL) Q1 4 left join (二つ目のSQL) Q2 5 on Q1.ID = Q2.ID 6 AND Q1.year = Q2.year 7 AND Q1.month= Q2.month 8ORDER BY Q1.ID, Q1.year, Q1.month

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

投稿2019/02/25 07:36

編集2019/02/25 07:40
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inu_inu

2019/02/25 08:10

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

0

ベストアンサー

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

投稿2019/02/25 07:00

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inu_inu

2019/02/25 07:09

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

2019/02/25 07:22

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

2019/02/25 08:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問