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

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

新規登録して質問してみよう
ただいま回答率
85.37%
GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

SQL

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

Q&A

解決済

4回答

39165閲覧

SQLのGROUP BYでNULLの値はグループ化をしない方法ありますか?

AtsushiNakamura

総合スコア46

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

SQL

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

1グッド

0クリップ

投稿2018/11/28 03:38

編集2018/11/28 05:22

id | status

1 | 1000
2 | 1000
3 | 2000
4 | 2000
5 | null
6 | null
7 | 3000

SELECT id, status,count(*) FROM 対象テーブル
GROUP BY status

としたとき、statusがnullの値はグループ化せず、
countを取る方法を知りたいです。

希望するレスポンスは
id | status | count(*)

1 | 1000 | 2
3 | 2000 | 2
5 | null | 1
6 | null | 1
7 | 3000 | 1

Yajamon👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/28 03:47

あります、ドキュメントをよんでね
guest

回答4

0

単純にwhereでnull以外に絞ればいいんじゃないでしょうか。
書き方は調べればすぐ出てきますよ。

投稿2018/11/28 03:55

m.ts10806

総合スコア80875

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

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

AtsushiNakamura

2018/11/28 05:24

申し訳ございません、説明不足でした。 nullの値も取得したいんですがグループにはしたくないってことなんですが、方法あるでしょうか
m.ts10806

2018/11/28 05:29

count(status)とか? create文とサンプルデータ用のinsert文ご提示いただければまだ検証できますが。 DBの種類によってはcaseでわけた方が楽ですかね。
m.ts10806

2018/11/28 05:44

まあ集約してるなら別にしないと難しいでしょうね。 null以外とnullだけのテーブルをunionするとかが堅実です。
m.ts10806

2018/11/28 05:45

他回答の通りですね
AtsushiNakamura

2018/11/28 06:04

unionする方法で解決できまいたした。ご丁寧にありがとうございました。
guest

0

そもそもstatusでgroup byしてidを表示することはできませんよ

sample

SQL

1create table tbl(id int,status int null); 2insert into tbl values(1,1000),(2,1000),(3,2000),(4,2000),(5,null),(6,null),(7,3000);
  • 集計

SQL

1select * from( 2select min(id) as id,status,count(*) as cnt from tbl where status is not null group by status 3union all select id,status,1 from tbl where status is null 4) as t 5order by id 6
  • unionしない別解

SQL

1select id,status,(select case when status is null then 1 else count(*) end from tbl where status=t1.status) as cnt from tbl as t1 2where not exists (select 1 from tbl where t1.id>id and t1.status=status)

投稿2018/11/28 05:36

編集2018/11/28 05:51
yambejp

総合スコア116468

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

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

AtsushiNakamura

2018/11/28 06:03

unionする方法で解決できまいたした。ご丁寧にありがとうございました。
guest

0

集約する対象には特定の値を、集約対象外には十分に細分化された値を持つ計算列を追加して、それを絡めて集約すればできます。

今回は 0 がなく、レコードに対して一意に存在する id を使えば良いでしょう。

sql

1SELECT 2 MIN(id), 3 status, 4 COUNT(*) 5 -- SELECT結果に計算列を表示する場合はGROUP BYと同じCASE文が必要なことに注意してください 6 -- CASE WHEN status IS NULL 7 -- THEN id 8 -- ELSE 0 9 -- END AS ungrouped_id 10FROM A_TABLE 11GROUP BY 12 status, 13 CASE WHEN status IS NULL 14 THEN id 15 ELSE 0 16 END

投稿2021/06/19 03:58

編集2021/06/19 09:50
Yajamon

総合スコア88

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

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

0

ベストアンサー

nullを除いた範囲をgroup byした結果と、nullのみを単純にselectした結果、両者をunionすればいいのではないでしょうか。

sql

1select 2 min(id) id 3 ,status 4 ,count(*) cnt 5from 6 TABLE1 7where 8 status is not null 9group by 10 status 11union all 12select 13 id 14 ,status 15 ,1 cnt 16from 17 TABLE1 18where 19 status is null

動作サンプル

投稿2018/11/28 05:47

alg

総合スコア2019

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問