hakeの日記

Windows環境でプログラミングの勉強をしています。

SQLite - グループ化(GROUP BY)

指定したカラム毎にグループ化して、そのグループ内で処理を行う

sqlite> select * from AAA;
tt          cate        val
----------  ----------  ----------
aaa         A           1.0
bbb         A           2.0
aaa         A           3.0
bbb         B           4.0
aaa         B           5.0
bbb         B           6.0
aaa         C           7.0
bbb         C           8.0

 
selectにカラム名のみ記述した場合は、そのグループでの最初のレコードのみが出力される。グループ化対象を条件選択したい場合はwhere句を使用する。

sqlite> select * from AAA group by tt;
tt          cate        val
----------  ----------  ----------
aaa         A           1.0
bbb         A           2.0
sqlite> select * from AAA group by tt,cate;
tt          cate        val
----------  ----------  ----------
aaa         A           1.0
aaa         B           5.0
aaa         C           7.0
bbb         A           2.0
bbb         B           4.0
bbb         C           8.0
sqlite> select * from AAA where cate <> 'B' group by tt,cate;
tt          cate        val
----------  ----------  ----------
aaa         A           1.0
aaa         C           7.0
bbb         A           2.0
bbb         C           8.0

 
なので通常は集計関数等を使用する。

sqlite> select tt,cate,count(*) from AAA group by tt,cate;
tt          cate        count(*)
----------  ----------  ----------
aaa         A           2
aaa         B           1
aaa         C           1
bbb         A           1
bbb         B           2
bbb         C           1

 
グループ化した結果に対して条件を付けたい場合はHAVING句で記述する。

sqlite> select tt,cate,count(*) from AAA group by tt,cate having tt='aaa';
tt          cate        count(*)
----------  ----------  ----------
aaa         A           2
aaa         B           1
aaa         C           1
sqlite> select tt,cate,count(*) from AAA group by tt,cate having count(*)>1;
tt          cate        count(*)
----------  ----------  ----------
aaa         A           2
bbb         B           2