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

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

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

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

SQL

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

Q&A

解決済

4回答

1253閲覧

GROUP BYで絞った結果をさらに絞る方法

enigumalu

総合スコア192

MySQL

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

SQL

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

0グッド

0クリップ

投稿2018/05/17 09:12

編集2021/07/20 06:39

年月ごとの総数を求めたかったのですが、GROUP BYを利用すると,まとめた総数からさらに条件をつけて絞った条件総数がわからず困っています。

SELECT DATE_FORMAT(rest_date, '%Y-%m') AS time, COUNT(*) AS count FROM res GROUP BY DATE_FORMAT(rest_date, '%Y%m');

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/05/17 09:17

CREATE TABLE文を示すか、表組みでテーブル構造を示してほしいです。あと、fixだresだと言われても第三者にはさっぱりわからないので、丁寧な説明がほしいです。
guest

回答4

0

ベストアンサー

まとめて取得ってこういう事?
※count()で数えられるのはNull以外なのでそれを利用する。

SQL

1SELECT DATE_FORMAT(rest_date, '%Y-%m') AS time 2 , COUNT(*) AS count 3 , COUNT(login_flag) AS login_count 4FROM res 5GROUP BY DATE_FORMAT(rest_date, '%Y-%m') 6;

もし、login_flag=1の時だけという場合は、
** sum(case when login_flag=1 then 1 end) AS login_count **
などとします。

login_flag=(0,1,null)という値の範囲なら、
** sum(login_flag) AS login_count **
でもいいですね。

追記

SQL

1SELECT DATE_FORMAT(res.rest_date, '%Y-%m') AS time 2 , COUNT(*) AS count 3 , COUNT(res.login_flag) AS login_count 4 , COUNT(fix.id) AS spare_count 5FROM res left join fix on res.id=fix.id 6GROUP BY DATE_FORMAT(res.rest_date, '%Y-%m') 7;

投稿2018/05/17 13:44

編集2018/05/18 04:10
sazi

総合スコア25173

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

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

enigumalu

2018/05/18 01:43

すいませんズバリそのとおりですありがとうございます。 この抽出条件に加えて、さらにfix(予備テーブル)に登録されているデータを別カラムとして纏めて抽出できませんでしょうか? イメージを追記しました
sazi

2018/05/18 04:11

追記しました。 尚、結合はidのみでされるものとしました。 ※日付がidで結合した時違ってるけどサンプルの誤り?
guest

0

実際にどうデータが取りたいのかわからなかったので、
group by したものをさらに条件付けする方法のひとつを書いてみます。

having句 を使います。

テーブル test

idcategorynum
1a1
2a3
3b0
4c5

こんなテーブルがあったとして、

「categoryごとにnumを合計した上で、numの合計が0以上のものをselectしたい場合」

sql

1select category, sum(num) as sum_num from test group by category having sum_num > 0

のように書きます。

having句の書く位置は、必ず、 group by より後ろです。

select category, sum(num) as sum_num from test group by category

の実行結果は、

categorysum_num
a4
b0
c5

こうなりますが、 having句を使うことで、

select category, sum(num) as sum_num from test group by category having sum_num > 0

の実行結果は、

categorysum_num
a4
c5

こうなります。

投稿2018/05/17 09:35

編集2018/05/17 09:36
mix-peach

総合スコア1910

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

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

0

サンプルがないので、具体的に何をやりたいかわかりませんが
集計したデータの小計や合計をほしいのであれば
with rollupを利用します

投稿2018/05/17 09:33

yambejp

総合スコア114769

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

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

0

テーブル構造を再現することが出来ないので一般論でいいますが、
GROUP BYしたSELECT文を使ってさらにSELECT文を書けばいいんじゃないですかね。
ざっくりとした流れは、

SELECT X.~ FROM ( SELECT ~ FROM ~ GROUP BY ~ ) AS X GROUP BY X.~

みたいな?
でも、もっと楽に書くこともできそうな気もしますので、
やはり書いてテストするためにも再現方法
(CREATE TABLE文&サンプルデータ用INSERT INTO文など)を示してほしいです。

投稿2018/05/17 09:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問