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

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

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

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

Q&A

解決済

1回答

2013閲覧

PostgreSQL 1対多のテーブル結合

person

総合スコア224

PostgreSQL

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

0グッド

0クリップ

投稿2023/06/12 11:28

編集2023/06/13 00:31

下記テーブルを作成し、データをインサートします。

CREATE TABLE table1(id integer); CREATE TABLE table2 (id integer, pcs integer, category integer); CREATE TABLE table1(id integer, value text); INSERT INTO table1(1); INSERT INTO table1(2); INSERT INTO table2 VALUES(1, 10, 1); INSERT INTO table2 VALUES(1, 9, 1); INSERT INTO table2 VALUES(1, 8, 2); INSERT INTO table2 VALUES(1, 7, 2); INSERT INTO table2 VALUES(2, 6, 1); INSERT INTO table2 VALUES(2, 5, 1); INSERT INTO table2 VALUES(2, 4, 2); INSERT INTO table2 VALUES(2, 3, 2); INSERT INTO table3 VALUES(1, 'a'); INSERT INTO table3 VALUES(1, 'b');

これを各idごとにpcsの合計値を表示したいです。
ただしcategory が1のもののみ。

作ったSELECT文

SELECT table1.id, SUM(table2.pcs), table3.value FROM table1 LEFT JOIN table2 ON table1.id = table2.id AND table2.category = 1 GROUP BY table1.id LEFT JOIN table3 ON table1.id = table3.id

エラー

ERROR: syntax error at or near "LEFT" LINE 7: LEFT JOIN table3 ^ SQL 状態: 42601 文字: 146

回答よろしくお願いします。

期待値

id, pcs, value -------------- 1, 19, a 2, 11, b

psql (PostgreSQL) 14.1

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

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

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

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

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

person

2023/06/13 00:20

質問自体に誤りがあったため修正します。
guest

回答1

0

ベストアンサー

以下のようなSQLになるかと思います。

SQL

1SELECT table1.id, SUM(table2.pcs) 2FROM table1 3LEFT JOIN table2 4ON table1.id = table2.id 5GROUP BY table1.id

2023-06-13 10:41 追記

修正後の要件を満たすSQLは以下のようなものになるかと思います。

SQL

1SELECT table1.id, SUM(table2.pcs), MAX(table3.value) 2FROM table1 3LEFT JOIN table2 ON table1.id = table2.id 4LEFT JOIN table3 ON table1.id = table3.id 5WHERE table2.category = 1 6GROUP BY table1.id

投稿2023/06/12 12:04

編集2023/06/13 01:42
neko_the_shadow

総合スコア2379

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

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

person

2023/06/13 00:31

回答して頂いたところ申し訳ありません。 質問自体に誤りがあったため修正します。
person

2023/06/13 02:35

回答ありがとうございます。 MAX()やMIN()を使うのですね。 table3のようにidが主キーののテーブルがほかにもいくつかあるときは、 その項目は全てMAX()を付ける必要があるということですね。
kikukiku

2023/06/13 04:40

データがもし下記の場合、maxを使うと、bを取得することになります。 どんな仕様にしたいのかを決めて、適切に判断することになると思います。 下記のように、id1つに対して複数レコードにならないのであるならば、 maxでもminでも結果は同じになります。 INSERT INTO table3 VALUES(1, 'a'); INSERT INTO table3 VALUES(1, 'b'); INSERT INTO table3 VALUES(2, 'a'); INSERT INTO table3 VALUES(2, 'b');
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問