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

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

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

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

Q&A

3回答

3274閲覧

SQLのFROM句で副問い合わせの組み合わせ

toku37636566

総合スコア0

SQL

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

0グッド

0クリップ

投稿2020/10/24 12:43

編集2020/10/24 13:49

前提・実現したいこと

次の口座について、入金と出金の両方が発生した日付を抽出する。
また、これまでの入金と出金それぞれの最大額も併せて抽出する。
ただし、FROM句で副問い合わせを用いること。
・口座番号:3104451

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

下記コードまでは書いたのですが、日付を入金額と出金額の両方があった日で抽出すると、
これまでの入金と出金それぞれの最大額を抽出するとができません。逆に入金額と出金額の最大額で抽出すると、日付が入金額と出金額の両方があった日で抽出できないです。両方の条件で抽出することは不可能なんでしょうか?
2週間やっても全然わかりませんでした。。。ご教授よろしくお願いします。

該当のソースコード

SELECT T.`口座番号`,T.`日付`,MAX(T.`入金額`),MAX(T.`出金額`) FROM (SELECT * FROM `取引` WHERE `口座番号`= '3104451')as T where T.`口座番号`= '3104451' GROUP BY `日付` HAVING sum(`出金額`) >0 and SUM(`入金額`)>0

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

データベース:phpMyAdmin
サーバのバージョン: 10.4.14-MariaDB - Source distribution
バージョン情報: 5.0.2, 最終安定バージョン: 5.0.4
サーバの文字セット: UTF-8 Unicode (utf8mb4)
上記で操作しています。

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

テーブルの定義  テーブル名 取引 列名     型    制約       備考 取引番号  integer   PKEY     取引の連番 取引事由ID  integer   FKEY    取引の内容コード値 日付     date   not null   取引のあった日付 口座番号    varchar  not null    取引のあった口座 入金額   integer        預け入れの金額 出金額   integer        引き出しの金額

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

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

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

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

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

Orlofsky

2020/10/24 13:09

同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで示したり、バージョンも明記した方が適切なコメントが付き易いです。
toku37636566

2020/10/24 13:46

アドバイス有難うございます。 変更してみました。
Orlofsky

2020/10/24 14:23

CREATE TABLE文を書けるようになった方が良いです。 2つ目の指摘は完全に無視しているから、すぐにしっぺ返しにあいますよ。
guest

回答3

0

日付を入金額と出金額の両方があった日で抽出すると、これまでの入金と出金それぞれの最大額を抽出するとができません。
逆に入金額と出金額の最大額で抽出すると、日付が入金額と出金額の両方があった日で抽出できないです。

これらは同時に成り立たない事象です。
事象が異なる場合は、別な問合せにする必要があります。
別な問合せを合わせて抽出する方法としては、サブクエリーやインラインビューがありますが、
普通はどちらが効率が良いかは実行計画などで確認して選択します。

ただし、FROM句で副問い合わせを用いること。

MySQL系はサブクエリーが遅い事が多いので、そういう決めなのでしょうね。

・インラインビュー

SQL

1SELECT T1.日付 2 , T2.`最大出金額` 3 , T2.`最大入金額` 4FROM `取引` as T1 5 inner join ( 6 select `口座番号` 7 , max(`出金額`) as `最大出金額` 8 , max(`入金額`) as `最大入金額` 9 FROM `取引` 10 group by `口座番号` 11 ) T2 12 on T1.`口座番号`=T2.`口座番号` 13where T1.`口座番号`= '3104451' 14 and `出金額` > 0 and `入金額` > 0

投稿2020/10/25 02:22

sazi

総合スコア25327

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

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

0

「入金と出金の両方が発生した日付(日付と口座番号でGROUP BY)」と、「入金と出金それぞれの最大額(口座番号GROUP BY)」とでは、お互いにGROUP BYする粒度が違うため、「発生している問題」に記載されている通り、現状のソースコードでは同時に取得することができないのだと思います。

FROM句での副問い合わせを上手く使えば、違うGROUP BYの粒度の情報を一度に取得できると思いますよ。

投稿2020/10/24 14:18

編集2020/10/24 14:21
yuxki

総合スコア110

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

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

0

SQLに限らず、見易いコードを書けるとコードの信頼性も仕事の効率も全然違います。

SQLの掟として、グループ関数(今回はMAX)を使う場合は、他のSELECTの並びにある列でGROUP BYする必要があります。

SQL

1SELECT 2 口座番号 3 , 日付 4 , MAX(入金額) AS MAX_入金額 5 , MAX(出金額) AS MAX_出金額 6FROM 取引 7WHERE 8 口座番号 = '3104451' 9GROUP BY 10 口座番号 11 , 日付 12HAVING 13 sum(出金額) > 0 14and SUM(入金額) > 0

投稿2020/10/24 14:12

Orlofsky

総合スコア16417

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

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

sazi

2020/10/25 02:25

質問の意図と全然違うので、流石にこれは回答になっていませんよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問