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

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

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

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

Q&A

4回答

1037閲覧

グルーピングしたデータとは別のカラムを取得したいです。

tomami

総合スコア6

SQL

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

0グッド

0クリップ

投稿2018/06/07 05:09

元のテーブル

AAA,BBB,CCC

1, ZZ, null
1, ZZ, YY
1, XZ, null
1, XZ, XX

  ↓

selectでとってきたい結果

AAA,CCC,count(*)

1, YY, 2
1, XX, 2

AAAとBBBでグルーピングして出力するのはAAAとCCC、
CCCがNULLのところはBBBの値が一緒の場合はそのCCCの値をあてがう感じです。
データがそのようになっていませんが、データは変更できません。

結果を以下のようにするにはどのようにすればよろしいでしょうか。
グルーピングだけならできるのですが。

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

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

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

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

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

papinianus

2018/06/07 05:20

CCCがnullでない行がかならず一つだけ含まれるということですか?AAA,BBBでグルーピングした結果、CCCがnullばかりであったときや、nullでないものが2つ以上あったらどうなることを想定していますか?
tomami

2018/06/07 05:27

ありがとうございます。AAAとBBBが同じものを一グループとして、CCCはどれか一つだけ必ず値あり、nullは複数あります。
guest

回答4

0

相関副問合せで件数を取得しておき、それを集計します

SQL

1select AAA,CCC, SUM(cnt) 2from ( 3 select AAA,CCC,(select count(*) from テーブル where AAA=t1.AAA and BBB=t1.BBB) cnt 4 from テーブル t1 5 where CCC is not null 6) iv 7group by AAA,CCC

CCCはどれか一つだけ必ず値あり

ということなので、以下のようにするだけでも良いかも

SQL

1select AAA,CCC,(select count(*) from テーブル where AAA=t1.AAA and BBB=t1.BBB) cnt 2from テーブル t1 3where CCC is not null

別解釈として、CCCが有効(Nullでない)なAAAとBBBのパターンの件数を求めるという事だと、

SQL

1select AAA,CCC,(select count(*) from テーブル where AAA=V1.AAA and BBB=V1.BBB) cnt 2from ( 3 select AAA,BBB,CCC 4 from テーブル t1 5 where CCC is not null 6 group by AAA,BBB,CCC 7) v1

投稿2018/06/07 05:24

編集2018/06/07 05:50
sazi

総合スコア25195

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

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

0

素直に読むとこう?

  • 元データ

SQL

1create table tbl(AAA int,BBB varchar(20),CCC varchar(20) null); 2insert into tbl values 3(1, 'ZZ', null), 4(1, 'ZZ', 'YY'), 5(1, 'XZ', null), 6(1, 'XZ', 'XX');
  • 集計

SQL

1select AAA,BBB,max(CCC) as CCC,count(*) as cnt from tbl group by AAA,BBB;
  • BBBが気に入らないのであればサブクエリで

SQL

1select AAA,CCC,cnt from 2(select AAA,BBB,max(CCC) as CCC,count(*) as cnt from tbl group by AAA,BBB) as sub;

投稿2018/06/07 06:25

yambejp

総合スコア114843

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

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

0

BBBだけではcount(*)のユニーク性を担保できないはずだからこうかなと

SQL

1select AB.AAA, 2(select CCC from `table` where CCC is not null and AB.AAA = `table`.AAA and AB.BBB = `table`.BBB) as CCC, 3AB.cnt from 4( 5 select AAA, BBB, count(*) as cnt 6 from `table` 7 group by AAA,BBB 8) as AB

投稿2018/06/07 06:03

papinianus

総合スコア12705

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

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

guest

0

例えばこのようなデータがあった場合

AAABBBCCC
1ZZnull
1ZZYY
1ZZXX

出力結果が一意に定まりませんよね。

AAACCCcount(*)
1YY1? 2?
1XX1? 2?

そこが限定できないと、望む形自体が伝わりませんよ。


AAA, BBB でグルーピングした結果、CCC がただ一つしか値がない(もしくはnull)なら、
これでいいのでは?

SQL

1SELECT AAA, MAX(CCC), COUNT(*) FROM table1 GROUP BY AAA, BBB

投稿2018/06/07 05:24

編集2018/06/07 06:32
tacsheaven

総合スコア13703

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

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

sazi

2018/06/07 06:52

確かに結果から見れば難しく考えなくても良いですね。 変にデータの正規化を考えながらアプローチしてしまった。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問