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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

3130閲覧

MySQLでのsumとそれ以外のカラムの取得

inst_yama

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2017/10/03 15:47

###前提・実現したいこと
MySQLで詰まっています。
1つのSQLであるカラムの集計(該当する項目のみ)集計に関係のないカラムの値が取りたいです。可能であればSQL文を教えてください。

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

簡単にするために以下のようなテーブルを作ってみました。
<testテーブル>
id int ai
up_time datetime
qty int
sub_id int
picupno int

データ
id up_time qty sub_id picupno
1 2017-10-01 00:00:00 20 1 0
2 2017-09-30 07:00:00 30 1 0
3 2017-10-02 00:00:00 100 2 1
4 2017-10-03 07:00:00 200 2 2

読みにくくてすいません。
sub_idごとにqtyの合計が必要です。更にsub_idごとのup_timeの毎の一番新しいup_timeとpicupnoが欲しいのです。

望む結果は、
up_time picupno sum(qty)
2017-10-01 00:00:00 1 50
2017-10-03 07:00:00 2 300

up_timeの最新(sub_idごとの)でその行のpicupnoとsub_idごとのsum(qty)です。

###試したこと
SELECT *,sum(qty) FROM test WHERE sub_id IN(1,2) GROUP BY sub_id

SELECT *,max(up_time), sum(qty) FROM test GROUP BY sub_id order by up_time DESC

いづれもup_timeが直近ではなく、picupnoも望むものではありません。

よろしくお願いいたします

###補足情報(言語/FW/ツール等のバージョンなど)
実動環境では
SELECT *,sum(qty) … GROUP BY sub_id
とかやると非集約ラムは参照できないというようなエラーが発生します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

sub_id毎の最新日付のデータを取得することと、sub_id毎の集計を取得することを分けて取得することを思いつけば、わりとすんなりと書けると思います。

SQL

1select up_time, picupno 2 ,(select sum(qty) from test where sub_id=t1.sub_id) as sum_qty 3from test as t1 4where up_time=(select max(up_time) from test where sub_id=t1.sub_id)

一応別解(相関問い合わせによるサブクエリーを使用しない版)

SQL

1select t1.up_time, t1.picupno, t2.sum_qty 2from test as t1 3 inner join ( 4 select sub_id, max(up_time) as max_up_time, sum(qty) as sum_qty from test group by sub_id 5 ) as t2 6 on t1.sub_id=t2.sub_id and t1.up_time=t2.max_up_time

MySQLはサンプルデータを触っている程度なので、大量のデータでのSQLの記述による性能差などは見地がありません。
なので、結果をフィードバックして頂けると喜びます。

投稿2017/10/03 16:02

編集2017/10/03 16:22
sazi

総合スコア25184

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

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

inst_yama

2017/10/04 13:43

早々とご回答ありがとうございます。 1つ目のSQLは、自分の理解力的に最適でした。 inner joinを使うのだろうとは思っていましたが、自分自身のテーブルをうまく連結することでsub _idカラムで出現するすべてのデータになることに思い至りませんでした。 実務では別解の方を利用するつもりです。何かフィードバックをできればと思います。 ありがとうございました。
guest

0

更にsub_idごとのup_timeの毎の一番新しいup_timeとpicupno

この条件であれば、up_timeとpicupnoのMAXをとればよいのではないでしょうか。

sql

1SELECT MAX(up_time), MAX(picupno), SUM(qty) FROM test GROUP BY sub_id

投稿2017/10/04 00:50

SVC34

総合スコア1149

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

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

inst_yama

2017/10/04 13:35

ご回答ありがとうございます。 希望する結果と同じものとなりました。 SQLがよくわかっていないので疑問が少し残りますが、常にup_timeと同じレコードのpicupnoが取得できるのでしょうか。質問自体がわかりにくい書き方だったかもしれません。 もし追加でご説明いただけるなら幸いです。
guest

0

sub_idとup_timeの値が同じ行がないことを条件に、下記のように考えました。

SQL

1SELECT t1.sub_id, t1.picupno, t2.qty, t2.up_time FROM test t1 2INNER JOIN (SELECT sub_id, SUM(qty) qty, MAX(up_time) up_time FROM test GROUP BY sub_id) t2 3ON t1.sub_id = t2.sub_id AND t1.up_time = t2.up_time;

投稿2017/10/03 16:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

inst_yama

2017/10/04 13:37

ご回答ありがとうございます。 希望する結果が得られました。 このSQLをベースに実務に合わせていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問