SQL重複排除と集計の基礎技術と応用方法

SQL

今回は重複排除(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を入れ子で実行する副問合せ・相関副問合せについて取り上げたいと思います!

コメント

タイトルとURLをコピーしました