MySQLで複数の列をGROUP BYする方法
MySQLで複数の列をGROUP BYする方法
回答: はい、可能です。MySQLでは、複数の列をGROUP BY句で指定することで、複数の列に基づいてデータをグループ化することができます。
例:
SELECT country, gender, COUNT(*) AS total
FROM users
GROUP BY country, gender;
このクエリは、users
テーブルのデータを国と性別でグループ化し、各グループのユーザー数をカウントします。
複数の列をGROUP BYする利点:
- データをより詳細に分析できます。
- 特定のグループのパターンや傾向を特定できます。
- 集計結果をより分かりやすく表示できます。
その他のGROUP BYオプション:
- HAVING句: グループ化されたデータの条件を指定できます。
補足:
- GROUP BY句で指定する列は、インデックスが張られているとパフォーマンスが向上します。
- GROUP BY句で指定する列は、集計関数で使用される必要があります。
注意:
- GROUP BY句で指定する列にNULL値が含まれている場合、その行はグループ化されません。
SELECT country, gender, COUNT(*) AS total
FROM users
GROUP BY country, gender;
# 結果
# country | gender | total
# ------- | ------- | --------
# Japan | Male | 100
# Japan | Female | 50
# USA | Male | 200
# USA | Female | 100
# NULL | NULL | 5
上記の例では、country
とgender
列でグループ化していますが、country
列とgender
列に同時にNULL値を持つ行が5行存在します。これらの行はどのグループにも属さず、別途出力されます。
SELECT country, gender, COUNT(*) AS total_users, SUM(age) AS total_age
FROM users
GROUP BY country, gender;
# 結果
# country | gender | total_users | total_age
# ------- | ------- | -------- | --------
# Japan | Male | 100 | 5000
# Japan | Female | 50 | 2500
# USA | Male | 200 | 10000
# USA | Female | 100 | 5000
説明:
COUNT(*)
: グループ内の行数をカウントします。SUM(age)
: グループ内の年齢の合計値を計算します。
その他のサンプルコード:
- 特定の国に属する男性ユーザーの数をカウントする:
SELECT COUNT(*) AS total_users
FROM users
WHERE country = 'Japan'
GROUP BY gender
HAVING gender = 'Male';
- 各国の平均年齢を計算する:
SELECT country, AVG(age) AS average_age
FROM users
GROUP BY country;
MySQLで複数の列をGROUP BYする他の方法
CUBEとROLLUPは、複数の列をGROUP BYする際に便利な集計関数です。
- CUBE: 指定されたすべての列の組み合わせでグループ化します。
- ROLLUP: 各列のすべてのレベルでグループ化します。
SELECT country, gender, COUNT(*) AS total
FROM users
GROUP BY CUBE(country, gender);
# 結果
# country | gender | total
# ------- | ------- | --------
# NULL | NULL | 500
# Japan | NULL | 250
# USA | NULL | 250
# Japan | Male | 100
# Japan | Female | 150
# USA | Male | 150
# USA | Female | 100
上記の例では、country
とgender
列をCUBE関数でグループ化しています。
CASE式を使用して、複数の列を1つの列に結合してからGROUP BYすることができます。
SELECT CASE
WHEN country = 'Japan' AND gender = 'Male' THEN 'Japan Male'
WHEN country = 'Japan' AND gender = 'Female' THEN 'Japan Female'
WHEN country = 'USA' AND gender = 'Male' THEN 'USA Male'
WHEN country = 'USA' AND gender = 'Female' THEN 'USA Female'
END AS group, COUNT(*) AS total
FROM users
GROUP BY group;
# 結果
# group | total
# -------- | --------
# Japan Male | 100
# Japan Female | 150
# USA Male | 150
# USA Female | 100
上記の例では、country
とgender
列をCASE式で1つの列group
に結合してからGROUP BYしています。
GROUP BYとJOINを組み合わせて、複数のテーブルからデータをグループ化することができます。
SELECT t1.country, t2.gender, COUNT(*) AS total
FROM users AS t1
INNER JOIN genders AS t2 ON t1.gender_id = t2.id
GROUP BY t1.country, t2.gender;
# 結果
# country | gender | total
# ------- | ------- | --------
# Japan | Male | 100
# Japan | Female | 150
# USA | Male | 150
# USA | Female | 100
上記の例では、users
テーブルとgenders
テーブルをJOINしてからcountry
とgender
列でGROUP BYしています。
mysql sql group-by