カウント関数を使用した MySQL グループ化

Abdul Basit 2024年2月15日
  1. MySQL のGROUP BY構文
  2. MySQL のGROUP BYと集計関数
  3. MySQL の GROUP BY 句と HAVING 句
  4. MySQL の複数の列に対するGROUP BY Count()
カウント関数を使用した MySQL グループ化

このチュートリアルでは、MySQL を使用した集計関数と併せて、SQL GROUP BY 句について説明します。

GROUP BY 句は、COUNT()SUM()MIN()MAX()、および などの集計関数と一緒に使用されることがよくあります。 AVG().

MySQL のGROUP BY構文

MySQL では、結果のビューをいくつかの列名でグループ化するために次の構文が使用されます。

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s);

MySQL のGROUP BYと集計関数

SQL では、GROUP BY 句を集計関数と一緒に使用して、特定の条件に対してレコード数をカウント、合計、または集計できます。

例 1: ORDERS テーブルがあり、注文日ごとにグループ化された注文数をカウントしたいとします。

注文テーブル

これは、次のクエリを使用して実現できます。

SELECT COUNT(OrderID) as Count, OrderDate
FROM Orders
GROUP BY OrderDate;

上記のクエリは、OrderDate でグループ化してすべての注文を取得し、OrderDate ごとに 1つのレコードを表示します。 したがって、結果のビューの各レコードには、OrderDate と、この日付のすべての OrderIDs の数が含まれます。

クエリの出力は次のようになります。

日付別注文

例 2: 以下は、各従業員の合計給与を検索する別の例です。 結果を取得するために次のテーブルを使用しているとします。

従業員テーブル

SELECT e.NAME, SUM(e.SALARY)
FROM Employee e
GROUP BY e.NAME;

上記のクエリでは、最初にテーブルからすべての NAME を選択し、次に SUM 関数を適用して各名前に対する給与の合計を計算します。 したがって、各 Name に対応する単一のレコードのみが存在する必要があります。

クエリの出力は次のようになります。

名前別総給与グループの出力

MySQL の GROUP BY 句と HAVING 句

HAVING 句を GROUP BY 句と組み合わせて使用すると、次のクエリで示すように、特定の条件に基づいて結果をさらにフィルター処理できます。

SELECT e.NAME, SUM(e.SALARY)
FROM Employee e
GROUP BY e.NAME
HAVING SUM(SALARY)>44000;

このクエリは上記と同じです。 ただし、唯一の違いは、HAVING 句を適用して給与をさらにフィルタリングし、最終的な給与合計が 44000 を超えるレコードのみを含めるようにしたことです。

このクエリの結果は次のようになります。

給与が 44000 を超える名前を出力する

MySQL の複数の列に対するGROUP BY Count()

COUNT() 集計関数は、複数の列を持つ GROUP BY 句と一緒に使用できます。 この場合、結果はまず最初の列でグループ化され、次に次の列でグループ化され、以降の列についても同様にグループ化されます。

その後、同じグループ化された値を持つすべての行がカウントされ、1つとして表示されます。

次の表から、特定の日付の特定の顧客の注文を数えたいとします。

注文テーブル

次のクエリを使用してそれを行うことができます。

Select CustomerId, OrderDate, COUNT(OrderId) as OrdersByCustomerByDate
FROM ORDERS
GROUP BY CustomerId, OrderDate;

すべての注文はまず CustomerId でグループ化され、次に OrderDate でグループ化されます。 その後、以下のクエリ結果に示すように、CustomerIDOrderDate が同じレコードはすべてカウントされ、1つのレコードとして表示されます。

日付ごとに顧客別注文を出力

$CustomerId = 1$ の顧客には、3つの注文があります。

2022 年 7 月 31 日 のこの顧客の 2つの注文はすべて、クエリ結果の 2 行目に $OrdersByCustomerByDate = 2$ で集約されます。 同じことが残りのレコードにも当てはまります。