COMPUTE および COMPUTE BY を使用したデータの集約
COMPUTE および COMPUTE BY 句は、旧バージョンとの互換性を維持するためにサポートされています。代わりに、次のコンポーネントを使用してください。
- SQL Server 2005 Analysis Services (SSAS) と OLE DB for Analysis Services または Microsoft ActiveX Data Objects Multidimensional (ADO MD) の組み合わせ。詳細については、「Analysis Services のデータ アクセス インターフェイス (SSAS)」を参照してください。
- ROLLUP オペレータ。詳細については、「ROLLUP を使用したデータの集約」を参照してください。
COMPUTE BY 句を使用すると、1 つの SELECT ステートメントで詳細行とサマリ行を生成できます。サブグループのサマリ値、または結果セット全体のサマリ値を計算することも可能です。
COMPUTE 句では、以下の情報を指定します。
- オプションの BY キーワード。列ごとに指定された行の集計が計算されます。
- 行の集計関数の名前。SUM、AVG、MIN、MAX、または COUNT があります。
- 行の集計関数の実行対象とする列。
COMPUTE により生成される結果セット
COMPUTE によって生成されるサマリ値は、クエリの結果セット内にそれぞれ別の結果セットとして表示されます。COMPUTE 句が含まれているクエリの結果は、コントロール ブレーク レポートのようになります。これは、指定したグループまたはブレークによって制御されるサマリ値を持つレポートです。各グループのサマリ値を生成することも、同じグループに対して複数の集計関数を使用した計算を実行することも可能です。
オプションの BY 句と共に COMPUTE を指定した場合、SELECT によって選択される各グループに対して次の 2 つの結果セットが生成されます。
- 各グループに対応する最初の結果セットには、そのグループの選択リスト情報を格納した一連の詳細行が含まれます。
- 各グループに対応する 2 つ目の結果セットには、そのグループに対する COMPUTE 句で指定された集計関数の小計を格納した 1 行が含まれます。
オプションの BY 句なしで COMPUTE を指定した場合、SELECT によって選択される各グループに対して次の 2 つの結果セットが生成されます。
- 各グループに対する最初の結果セットには、選択リスト情報を格納したすべての詳細行が含まれます。
- 各グループに対する 2 つ目の結果セットには、COMPUTE 句で指定された集計関数の総計を格納した 1 行が含まれます。
COMPUTE の使用例
次の SELECT
ステートメントでは、単純な COMPUTE
句を使用して、SalesOrderDetail
テーブルの単価および割引の総計を生成します。
USE AdventureWorks
SELECT SalesOrderID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID
COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount)
次のクエリでは、オプションの BY
キーワードを COMPUTE
句に追加し、各販売注文の小計を生成します。
USE AdventureWorks
SELECT SalesOrderID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID
COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount) BY SalesOrderID
この SELECT
ステートメントの結果として、各販売注文に対する 2 つの結果セットが返されます。各販売注文に対する最初の結果セットには、選択リストで指定した情報を格納した一連の行があります。各販売注文に対する 2 つ目の結果セットには、COMPUTE
句に指定された 2 つの SUM
関数の小計が格納されます。
メモ : |
---|
osql などの一部のユーティリティでは、各小計が結果セット内で別個の行であるように、複数の小計または総計の集計サマリが表示されます。これはユーティリティの出力形式によるもので、小計または総計が 1 行で返されます。SQL Server Management Studio などの他のアプリケーションでは、複数の集計が同じ行に表示されます。 |
COMPUTE と GROUP BY の差異
次に、COMPUTE と GROUP BY の違いを示します。
- GROUP BY は結果セットを 1 つだけ生成します。グループ化列とそのグループの小計を示す集計関数だけを含む行がグループごとに 1 つあります。選択リストには、グループ化列と集計関数だけを含めることができます。
- COMPUTE は複数の結果セットを生成します。1 つは、グループごとに選択リストの式を含む詳細行の結果セットです。それ以外はグループごとの小計または SELECT ステートメントの総計を含む結果セットです。選択リストには、グループ化列や集計関数以外の式を含めることができます。集計関数は、選択リストではなく COMPUTE 句で指定します。
次のクエリは、GROUP BY
と集計関数を使用しています。このクエリからは、グループごとに 1 行の結果セットが 1 つ返され、集計された小計を格納しています。
USE AdventureWorks
SELECT SalesOrderID, SUM(UnitPrice), SUM(UnitPriceDiscount)
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
メモ : |
---|
COMPUTE 句または COMPUTE BY 句に、ntext 型、text 型、または image 型を含めることはできません。 |