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

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

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

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

PostgreSQL

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

Q&A

解決済

2回答

1831閲覧

複数キーでのinner join

Nobara

総合スコア0

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

PostgreSQL

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

0グッド

0クリップ

投稿2021/12/06 05:31

編集2021/12/06 07:26

前提・実現したいこと

PostgreSQLでクエリ作成しています。
スーパーでの購入履歴をまとめたテーブルから、MartAとMartBでの購入金額の合計を取得したいのですが、
同一テーブルのデータを結合させてデータを取得する際に、以下のエラーメッセージが発生します。
結合したテーブルの金額(A2.購入金額)を指定するとエラーが出ているようなのですが、原因が特定できません。。
解決する方法ご存じであれば教えてください。

他にも気になる点あればご指摘しただけると!

発生している問題・エラーメッセージ

IllegalArgumentException: Error invoking method public void

該当のソースコード

TableLayout

1create table 購入履歴 2(年 integer, 3月 integer, 4ユーザID varchar(10), 5スーパー名 varchar(10), 6購入金額 integer);

postgresql

1select A1.年, A1.月, A1.ユーザID, A1.購入金額, A2.購入金額, A1.購入金額+A2.購入金額 AS 合計金額 2from 購入履歴 K1 3inner join 購入履歴 K2 4on A1.年 = A2.年 and 5A1.月 = A2.月 and 6A1.ユーザID = A2.ユーザID and 7A2.スーパー名 = 'MartB' 8where A1.年 = '2021' and 9A1.スーパー名 = 'MartA'

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2021/12/06 05:44

該当テーブルの定義をcreate tableでご提示ください
guest

回答2

0

「MartAとMartBでの購入金額の合計を取得したい」ということですが、
問題文から察するに、
月単位の購入金額の合計をMartAとMartBそれぞれで出しつつ、その合計も取得したい、
ということでしょうか。

where句でwhere スーパー名 = 'MartA'として
group by句でgroup by 年, 月とした
select文select 年, 月, 'MartA' as "スーパー名", sum(購入金額) as "購入金額"
とすると'MartA'に関する集約表が得られて、
同じように'MartB'に関する集約表が得られて、
Aの集約表とBの集約表をFULL OUTER JOINすれば求まるのではないかと。

ただし、この場合、Aの集約表とBの集約表のどちらにも購入履歴がない年月のデータがないので、
年月を飛ばすことなく埋めたい場合には、もうひと工夫必要になります。

投稿2021/12/06 06:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Nobara

2021/12/06 07:17 編集

ご回答ありがとうございます! 年・月・名前・スーパー名のキーでは複数一致があればGroupingしてSUM出すのが良いですね。 今回の場合、上記のキーで必ず1行になることが分かっているので、SUMする必要はない、かつMartAとMartBの両方で買い物した履歴がある場合のみ抽出したいので、inner join でやりたいと思っています。 上記のIllegalParameter を解決できれば一番うれしいので(技術的にもなぜエラーになるのか解決しあいです)、join についてもう少し詳しくご存じでしたら教えてください。
guest

0

自己解決

A1.購入金額とA2.購入金額 を併記していた部分を、以下にするとエラー解消できました!
A1.購入金額 as ”A1購入金額”, A2.購入金額 as ”A2購入金額”
同一カラム名を併記していたことが原因でIllegalArgumentエラーになっていたようです。

ご回答頂いた方、確認して頂いた方、ありがとうございました!

投稿2021/12/06 07:29

Nobara

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問