SQL Server GROUPBY句
- 12-09-2022
- Toanngo92
- 0 Comments
Mục lục
GroupBy.節
GROUP BY句は、結果セットを1つ以上のサブセットに分割します。各サブセットには、共通の値と式があります。 GROUP BYキーワードの後には、グループ化された列と呼ばれる列のリストが続きます。グループ化された各列は、結果セットの行数を制限します。グループ化された列ごとに、行は1つだけです。 GROUP BY句には、複数のグループ化された列を含めることができます。
構文:
SELECT select_list FROM table_name GROUP BY column_name1,column_name2, ... ;
AdventureWorks2019のWorkOrderRoutingテーブルのシナリオを考えてみましょう。各作業指示の合計リソース時間を計算する必要があります。これを実現するには、レコードをWorkOrderID列である作業指示番号でグループ化する必要があります。
以下の例では、各作業指示の合計リソース時間を取得して、作業指示番号とともに表示します。このクエリでは、SUM()という名前の組み込み関数を使用して合計を計算します。 SUM()は、列のレコードを合計する関数です。
SELECT WorkOrderID,SUM(ActualResourceHrs) AS TotalHoursPerWorkOrder FROM Production.WorkOrderRouting GROUP BY WorkOrderID
executeステートメントは、すべてのWorkOrdersと合計リソース時間を返します。
GROUP BY句は、次のような他の句と組み合わせて使用することもできます。
GROUP BY with WHERE
WHERE句をGROUPBY句とともに使用して、データグループ化の行を制限できます。検索条件を満たす行は、再グループ化の対象と見なされます。検索条件を満たさない行は、グループ化プロセスが完了する前に削除されます。
例えば:
SELECt WorkOrderID,SUM(ActualResourceHrs) AS TotalHoursPerWorkOrder FROM Production.WorkOrderRouting WHERE WorkOrderID < 50 GROUP BY WorkOrderID
NULLを使用したGROUPBY
グループ列にnullが含まれている場合、その行は結果セット内の個別のグループになります。グループ列に複数のNULL値が含まれている場合、NULL値は1つの行に含まれます。 Production.Productテーブルについて考えてみます。 Class列にNULL値がある行がいくつかあります。
テーブルクエリにGROUPBYを使用すると、NULL値も使用されます。たとえば、次のコードは、各クラスの定価の平均価格を取得して表示します
SELECT Class, AVG(ListPrice) AS 'AverageListPrice' FROM Production.Product GROUP BY Class
GROUP BY with ALL
ALLキーワードは、GROUPBY句とともに使用できます。 SELECTにWHERE句がある場合にのみ意味があります。 ALLを使用すると、GROUPBY句で作成されるすべてのグループが含まれます。検索条件を満たさないグループも含まれます。
構文:
SELECT <column_name> FROM <table_name> WHERE <condition> GROUP BY ALL <column_name>
Sales.SalesTerritoryテーブルについて考えてみます。このテーブルには、販売エリアの座標位置を示すGroupという名前の列があります。以下のコードは、各グループの総売上高を計算して表示します。出力には、売上があるかどうかに関係なく、すべてのグループを表示する必要があります。これを実現するために、コードはGROUPBYとALLを使用します
SELECT [Group], SUM(SalesYTD) AS 'TotalSales' FROM Sales.SalesTerritory WHERE [Group] LIKE 'N%' OR [Group] LIKE 'E%' GROUP BY ALL [Group]
HAVINGでGROUPBY
HAVING句はSELECTステートメントとともに使用され、グループの検索条件を指定します。 HAVING句は、SUM()などの集計関数に対してWHERE句を使用できない場所ではWHERE句のように機能します。 GROUP BY句を使用してグループを作成したら、結果をさらにフィルタリングすることをお勧めします。 HAVING句は、WHERE句がFROM句によって返される行のフィルタとして機能するのと同様に、行のフィルタとして機能します。
構文:
SELECT <column_name> FROM <table_name> GROUP BY <column_name> HAVING <search_condition>
例えば:
SELECT [Group],SUM(SalesYTD) AS 'TotalSales' FROM Sales.SalesTerritory WHERE [Group] LIKE 'P%' GROUP BY ALL [Group] HAVING SUM (SalesYTD) < 6000000
データの要約
GROUP BY句は、CUBE演算子とROLLUP演算子も使用して要約データを返します。 GROUP BY句の列数によって、結果セットのサマリー行の数が決まります。演算子の説明は次のとおりです。
CUBE
CUBEは、スーパーアグリゲート行を生成するアグリゲート演算子です。 GROUP BYによって提供される通常の行に加えて、GROUPBY句が生成する行の要約も提供します。
グループの可能なすべての組み合わせに対して表示される要約行は、結果セットです。概要行には結果セットにNULLが表示されますが、それらのすべての値が同時に返されます。
構文:
SELECT <column_name> FROM <table_name> GROUP BY <column_name> WITH CUBE
例えば:
このサービスは、オーストラリアとカナダを除く各国の総売上高を表示します
SELECT Name, CountryRegionCode, SUM(SalesYTD) AS TotalSales FROM Sales.SalesTerritory WHERE Name <> 'Australia' AND Name <> 'Canada' GROUP BY Name,CountryRegionCode WITH CUBE
CUBEは、GROUPBY句の拡張のようなものです。 CUBEを使用すると、GROUPBY句で指定されたすべてのグループ列の組み合わせを小計することができます。
巻き上げる
GROUP BYによって生成される通常の行に加えて、結果セットに要約行も挿入します。これはCUBE演算子に似ていますが、グループを階層順に表示する結果セットを生成します。グループを最低から最高にソートします。結果のグループ化階層は、グループ化された列が指定されている順序によって異なります。
構文:
SELECT <column_name1>[,<column_name2>] FROM <table_name> GROUP BY < WITH ROLLUP
例えば:
SELECT [Name], SUM(SalesYTD) AS TotalSales FROM Sales.SalesTerritory GROUP BY [Name] WITH ROLLUP