概要
DISTINCT
はフィールドの重複を除いた結果を返す。
確認に使用するデータ
以下のデータを使う。日時ごとのパスタのメニューの注文票で、パスタはソースと麺の種類の組み合わせ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
mysql> SELECT * FROM pasta_order; +---------------------+----------+----------------+-------+ | order_time | source | pasta | price | +---------------------+----------+----------------+-------+ | 2021-02-01 10:30:00 | トマト | スパゲッティー | 900 | | 2021-02-01 11:30:00 | トマト | フィットチーネ | 900 | | 2021-02-01 12:00:00 | オイル | スパゲッティー | 800 | | 2021-02-01 12:30:00 | クリーム | リングイネ | 850 | | 2021-02-01 13:00:00 | トマト | リングイネ | 900 | | 2021-02-02 11:00:00 | トマト | スパゲッティー | 900 | | 2021-02-02 12:00:00 | クリーム | スパゲッティー | 850 | | 2021-02-02 12:30:00 | トマト | リングイネ | 900 | | 2021-02-02 13:00:00 | トマト | スパゲッティー | 900 | | 2021-02-03 10:30:00 | クリーム | スパゲッティー | 850 | | 2021-02-03 11:00:00 | オイル | スパゲッティー | 800 | | 2021-02-03 11:30:00 | オイル | フィットチーネ | 800 | | 2021-02-03 12:00:00 | クリーム | リングイネ | 850 | | 2021-02-03 12:30:00 | トマト | フィットチーネ | 900 | | 2021-02-03 13:00:00 | オイル | スパゲッティー | 800 | +---------------------+----------+----------------+-------+ 15 rows in set (0.00 sec) |
フィールドの重複を除いた抽出
まずソース、麺それぞれのフィールドから重複を除いた結果を抽出。ソースの種類、麺の種類は3種類のため、それぞれ3つのレコードが返される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
mysql> SELECT -> DISTINCT source -> FROM pasta_order; +----------+ | source | +----------+ | トマト | | オイル | | クリーム | +----------+ 3 rows in set (0.00 sec) mysql> SELECT -> DISTINCT pasta -> FROM pasta_order; +----------------+ | pasta | +----------------+ | スパゲッティー | | フィットチーネ | | リングイネ | +----------------+ 3 rows in set (0.00 sec) |
日付による集計
日付単位の表示
DATETIME
で登録されているフィールドを日付のみの表現に変更する。その結果、同じ日付で複数のソースと麺の組み合わせのレコードになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
mysql> SELECT -> DATE_FORMAT(order_time, '%Y-%m-%d') AS date, -> source, -> pasta -> FROM pasta_order; +------------+----------+----------------+ | date | source | pasta | +------------+----------+----------------+ | 2021-02-01 | トマト | スパゲッティー | | 2021-02-01 | トマト | フィットチーネ | | 2021-02-01 | オイル | スパゲッティー | | 2021-02-01 | クリーム | リングイネ | | 2021-02-01 | トマト | リングイネ | | 2021-02-02 | トマト | スパゲッティー | | 2021-02-02 | クリーム | スパゲッティー | | 2021-02-02 | トマト | リングイネ | | 2021-02-02 | トマト | スパゲッティー | | 2021-02-03 | クリーム | スパゲッティー | | 2021-02-03 | オイル | スパゲッティー | | 2021-02-03 | オイル | フィットチーネ | | 2021-02-03 | クリーム | リングイネ | | 2021-02-03 | トマト | フィットチーネ | | 2021-02-03 | オイル | スパゲッティー | +------------+----------+----------------+ 15 rows in set (0.00 sec) |
日付ごとのユニークデータの数
単一のフィールド
単一フィールド中のユニークなデータの数は以下のようにしてカウントする。
COUNT(DISTINCT col)
以下は、日付ごとにグルーピングし、各日付で重複を除いたソースの数をカウントしている。2/2はクリームとトマトの2種類だけというのが反映されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> SELECT -> DATE_FORMAT(order_time, '%Y-%m-%d') AS date, -> COUNT(DISTINCT source) -> FROM pasta_order -> GROUP BY date; +------------+------------------------+ | date | COUNT(DISTINCT source) | +------------+------------------------+ | 2021-02-01 | 3 | | 2021-02-02 | 2 | | 2021-02-03 | 3 | +------------+------------------------+ 3 rows in set (0.00 sec) |
また、日付ごとの麺の種類の数もカウントしてみる。2/2がスパゲッティーとリングイネの2種類になっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> SELECT -> DATE_FORMAT(order_time, '%Y-%m-%d') AS date, -> COUNT(DISTINCT pasta) -> FROM pasta_order -> GROUP BY date; +------------+-----------------------+ | date | COUNT(DISTINCT pasta) | +------------+-----------------------+ | 2021-02-01 | 3 | | 2021-02-02 | 2 | | 2021-02-03 | 3 | +------------+-----------------------+ 3 rows in set (0.00 sec) |
複数フィールド
複数フィールドの組み合わせがユニークなものの数のカウントは以下のようにする。
COUNT(DISTINCT CONCAT(col1, col2, ...))
以下の例では、ソースとパスタの組み合わせがユニークなものの数を日付ごとに集計する。2/2はトマトスパゲッティーが2回、2/3はオイルスパゲッティーがあり、重複を除いてカウントしている。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> SELECT -> DATE_FORMAT(order_time, '%Y-%m-%d') AS date, -> COUNT(DISTINCT CONCAT(source, pasta)) -> FROM pasta_order -> GROUP BY date; +------------+---------------------------------------+ | date | COUNT(DISTINCT CONCAT(source, pasta)) | +------------+---------------------------------------+ | 2021-02-01 | 5 | | 2021-02-02 | 3 | | 2021-02-03 | 5 | +------------+---------------------------------------+ 3 rows in set (0.00 sec) |