カウント関数を使用した 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 を超えるレコードのみを含めるようにしたことです。
このクエリの結果は次のようになります。
MySQL の複数の列に対するGROUP BY Count()
COUNT()
集計関数は、複数の列を持つ GROUP BY
句と一緒に使用できます。 この場合、結果はまず最初の列でグループ化され、次に次の列でグループ化され、以降の列についても同様にグループ化されます。
その後、同じグループ化された値を持つすべての行がカウントされ、1つとして表示されます。
次の表から、特定の日付の特定の顧客の注文を数えたいとします。
次のクエリを使用してそれを行うことができます。
Select CustomerId, OrderDate, COUNT(OrderId) as OrdersByCustomerByDate
FROM ORDERS
GROUP BY CustomerId, OrderDate;
すべての注文はまず CustomerId
でグループ化され、次に OrderDate
でグループ化されます。 その後、以下のクエリ結果に示すように、CustomerID
と OrderDate
が同じレコードはすべてカウントされ、1つのレコードとして表示されます。
$CustomerId = 1$
の顧客には、3つの注文があります。
2022 年 7 月 31 日
のこの顧客の 2つの注文はすべて、クエリ結果の 2 行目に $OrdersByCustomerByDate = 2$
で集約されます。 同じことが残りのレコードにも当てはまります。