今回は重複排除(distinct句)と集計(group by)の紹介です。
どちらも挙動が似ているのでまとめて紹介します。
【機能説明】
・重複排除
select文の結果について、重複を排除することができる。
・集計
指定したカラムで集計を行うことができる。
(結果として重複排除もされる)
select文で集計関数を使用することができるようになる。
(該当行数を返すCOUNT関数、最大値を返すMAX関数、最小値を返すMIN関数等)
なお、having句でgroup byで集計した結果に対して条件で抽出することができる。
(where句も同じように抽出を行うが、where句は集計前に、having句は集計後に抽出する違いがある)
【文法】
・重複排除
select distinct…
・集計
select…
from…
(where…)
group by 集計を行うカラム名(,集計を行うカラム名…)
(having 条件)
(order by…)
【対象テーブル例】
・ご意見
+--------+--------+----------+
| 店舗ID | 商品ID | ご意見 |
+--------+--------+----------+
| 1 | 4 | ほげ14 |
| 1 | 4 | NULL |
| 1 | 5 | ほげ15 |
| 3 | 2 | ほげ32 |
+--------+--------+----------+
【使用例】
asは省略可能である。
・重複排除(distinct句)
select distinct 店舗ID,
商品ID
from ご意見
order by 店舗ID,商品ID;
↓
+--------+--------+
| 店舗ID | 商品ID |
+--------+--------+
| 1 | 4 |
| 1 | 5 |
| 3 | 2 |
+--------+--------+
※店舗ID=1、商品ID=4の行は2行存在するが、重複排除され1行のみ出力された。
・重複排除(group by句)
select 店舗ID,
商品ID
from ご意見
group by 店舗ID,商品ID
order by 店舗ID,商品ID;
↓
+--------+--------+
| 店舗ID | 商品ID |
+--------+--------+
| 1 | 4 |
| 1 | 5 |
| 3 | 2 |
+--------+--------+
※この例のように、order by句でdistinct句と同じように重複排除を実現できる。
しかし、本来、order by句は後述の集計で使うので、重複排除のために使うのであればdistinct句の方が意図は伝わりやすい。
また、distinct句とorder by句で実行時間に差が出る場合もある。
・集計(count関数)
select 店舗ID,
商品ID,
count(*) as ご意見件数
from ご意見
group by 店舗ID,商品ID
order by 店舗ID,商品ID;
↓
+--------+--------+------------+
| 店舗ID | 商品ID | ご意見件数 |
+--------+--------+------------+
| 1 | 4 | 2 |
| 1 | 5 | 1 |
| 3 | 2 | 1 |
+--------+--------+------------+
※count関数の引数にカラム名を指定すると、そのカラムがNULLではない件数を返す。
例えば、count(ご意見件数)なら、店舗ID=1、商品ID=4の行のご意見件数は1になる。
・集計(having句での抽出)
select 店舗ID,
商品ID
from ご意見
group by 店舗ID,商品ID
order by 店舗ID,商品ID
having 店舗ID = 1;
↓
+--------+--------+
| 店舗ID | 商品ID |
+--------+--------+
| 1 | 4 |
| 1 | 5 |
+--------+--------+
いかがでしたでしょうか。
今回は、SQLでの重複排除と集計について記事を書きました。
SQLではこのような操作も簡単に書くことができます。
特に、運用作業でデータ加工する時に重宝すると思います。
次回は、SQLを入れ子で実行する副問合せ・相関副問合せについて取り上げたいと思います!


コメント