T-SQLSUM関数は基本的な関数の1つです。その目的は、指定された列のすべての値の合計を計算することです。これは数値列にのみ適用されることに注意してください。
以下はSQLSUMの構文です。
-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )
-- Analytic Function Syntax
SUM ([ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)
- すべて はデフォルト値であり、渡す必要はありません。すべての値の合計を返すことができます。
- DISTINCT 重複する値を無視して、一意の値の合計のみを返す必要があることを指定します。
- 表現 ビットを除く、正確または概算の数値データ型カテゴリです。 データ・タイプ。
- オーバー 節とpartition_by_clause およびorder_by_clause 特定のパーティションでこの機能を使用するためのものです。
- partition_by_clause FROM句によって生成された結果セットを、関数が適用されるパーティションに分割します
- order_by_clause 操作が実行される論理的な順序を決定します。
SQL SUM関数の使用法を示すために、 Employeeという名前のテーブルを作成しました。 。 5つの列があります–名前 、給与 、家賃 、税金 、および雇用の性質 。次のユースケースに焦点が当てられます:
- SUM関数の基本的または単純な使用法
- CASE式でのSUMの使用
- GROUPBYステートメントでSUMを使用する
- HAVING句でSUMを使用する
- 複数または複雑な数式にSUMを適用する
また、WHERE句でSUMを使用する、ORDER BY句を使用する、SUM関数でDISTINCTを使用して一意の値の合計を取得するなど、他の使用例についても学習します。しかし、まず最初に。
ユースケース1:単純なSQLSUM関数
上記のように、 Employeeという名前のテーブルがあります 列が少ない。あなたの会社が、すべての従業員に費やしている給与コストを知りたいとします。価値を得るには、すべての従業員の給与を追加する必要があります。 SUM()はあなたの生活を楽にし、そのようなレポートを迅速に提供します。
給与でSUM()関数を使用します 列に入力すると、出力は会社のすべての従業員に費やされた給与コストの合計になります。
USE DBName
GO
SELECT SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
列にNULL値がある場合、この関数はそれを無視して次の行の値に進みます。したがって、組織を辞めた従業員にはNULLが含まれる可能性があります。会社は、そのリソースに何も支払っていません。
以下の出力を見ることができます–それは従業員の給与に費やされた885000ドルの金額を示しています:
重複がある場合 任意の列の値であり、すべての一意のの合計を取得したい 値の場合、 DISTINCTを使用できます 引数:
USE DBName
GO
--Get the sum of all values from column salary
SELECT SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
GO
--Get the sum of all unique values from column salary
SELECT SUM(DISTINCT Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
GO
私は両方のステートメントを一緒に実行しました。まず、すべての給与値を含む前のステップのものでした。 2つ目は、一意の値用で、 DISTINCTを使用しました 引数。
以下のスクリーンショットをご覧ください–両方のステートメントの出力を示しており、それらは異なります。デフォルトですべての値にSUM関数を使用すると、出力は$885000になります。 DISTINCTを使用している場合 一意の値の合計のみを取得する引数の場合、出力は$65000です。
したがって、この列にも同様の値があります。ビジネス用語では、給与と同じ金額を受け取る従業員がほとんどいないことを意味します。
この例は、 DISTINCTの使用法を示しています すべての一意の値の合計を取得するための引数。実際には、最終結果からの重複値を回避できます。
WHEREも使用できます SQL SUM()の句。あなたの会社が、正社員ではなく、給与として$ 100000を超える従業員に費やす総コストを取得して、コスト配分を理解したいとします。 場所 条項は結果をフィルタリングし、ビジネス要件に従って総コストを提供します。
以下のT-SQLステートメントでは、場所を確認できます。 Employment Natureに条項が追加されました 桁。この列には、正社員か契約社員かを問わず、各従業員の記録が保持されます。
AND演算子を使用して、両方の要件をクラブしていることに注意してください。
USE DBName
GO
SELECT SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
WHERE [Employment Nature] = ‘Contractor’ AND Salary >100000
GO
この出力は、会社が100000ドル以上を受け取っている従業員に240000ドルを費やしており、正社員ではないことを示しています。
ユースケース2:CASE式を使用したSQLSUM関数
私たちのシナリオでは、何人の従業員が他の詳細とともに常勤として働いているかを知りたいと思います。この結果を得るには、ケースを使用できます SUM()の式 働き。ただし、 WHERE を入力するだけで、この結果を簡単に取得できます。 条項、場合によってはケースが必要です およびSUM 複雑なクエリ要件で。
CASEを使用した以下のT-SQLステートメントをご覧ください。 SUM()内の式 機能:
--USE SUM function with CASE expression
SELECT
SUM(
CASE
WHEN [Employment Nature] = ‘Permanent’ THEN 1
ELSE 0
END) As [Total Employees],
FROM [dbo].[Employee]
上記のステートメントの出力は4を示しています。従業員の記録によると、会社には4人の正社員しかいません。 テーブル。
ケースの別の例を見てみましょう SUM()を使用 。
ユースケース1を調査しているときに、ユースケース1の上記のセクションで、100000ドル以上を受け取った契約社員に費やされた合計コストを見つけました。次に、そのような従業員の数を調べます。そして、ケース 表情が再び浮かび上がります。
ケースを使用できます 以前に使用したのと同じT-SQLステートメントで。以下に例を示します。
USE DBName
GO
SELECT SUM(Salary) As [Total Employees Cost],
SUM(CASE WHEN [Employment Nature] = ‘Contractor’ AND Salary >100000 THEN 1
ELSE 0
END) AS [Contractors Headcount]
FROM [dbo].[Employee]
WHERE [Employment Nature] = ‘Contractor’ AND Salary >100000
GO
出力は、2人の請負業者が働いて$100000以上を獲得していることを示しています。
ケースのさまざまな側面を使用できます SELECTの式 SUM()とともにステートメント ビジネスニーズを満たす機能。
ユースケース3:GROUPBYを使用したSQLSUM関数
私たちの会社が、正社員に費やす合計金額と、契約社員に費やす金額を知りたいとしましょう。この結果セットは、 SUMを使用して取得できます。 GROUP BYとともに機能します ステートメント。
以下のT-SQLステートメントを見てください。 GROUP BYを使用しました 雇用の性質に関する声明 列を作成し、給与にSUM関数を適用しました 雇用の性質に分類された各タイプの従業員の総給与を取得するための列。
USE DBName
GO
SELECT [Employment Nature], SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
GROUP BY [Employment Nature]
結果セットは、請負業者と正社員に費やされた合計金額を提供します。これらの両方の数値を加算すると、それらの合計は従業員の給与に費やされた合計金額になります(この数値をこの記事の最初のスクリーンショットと比較してください)。
ユースケース4:HAVINGステートメントを使用したSQLSUM関数
次に、HAVINGステートメントとGROUPBYステートメントを一緒に使用したSUM関数の使用法について説明します。この例では、年間150000ドル以上を受け取る従業員のリストを表示します。 WHERE句を指定したSELECTステートメントを使用するだけで取得できますが、HAVING、GROUP BY、およびSUMを使用して同じ結果を取得する方法を示します。
2つのT-SQLスクリプトがあります。両方のステートメントの出力は同じですが、最初のスクリプトは単純なSELECTステートメントを使用しますが、2番目のコードはGROUPBY句とHAVING句とともにSUM関数を使用します。
USE DBName
GO
SELECT name, salary
FROM [dbo].[Employee]
WHERE Salary >=150000
GO
--SUM with HAVING
SELECT name, SUM(salary) AS [Salary]
FROM [dbo].[Employee]
GROUP BY name HAVING SUM(salary) >=150000
GO
両方のスクリプトの出力を参照してください:
これらのステートメントを使用する別の側面があります。 rent を取得するために、SUM関数で算術式を渡しました。 および税金 従業員の経費。次に、 GROUP BYを適用しました および持っている 給与に関する声明 桁。簡単に言えば、給与が150000ドル以上の従業員が費やした家賃と税金の合計を知りたいと思いました。
また、2つのクエリを使用しました。 1つ目は、150000ドル以上を受け取ったすべての従業員の詳細を示しています。この出力は、妥当性確認と妥当性確認のためだけにフェッチされます。 2つ目はSUMを使用します 2つの列で機能する( rent および税金 )総経費として。次に、 GROUP BYが適用されます および持っている 条項:
USE DBName
GO
SELECT name, salary
FROM [dbo].[Employee]
WHERE Salary >=150000
GO
--SUM with HAVING and GROUP BY
SELECT name, SUM( rent + tax) AS [Total Expenses]
FROM [dbo].[Employee]
GROUP BY name HAVING SUM(salary) >=150000
GO
出力を分析してみましょう。最初のクエリには、給与が$150000以上の従業員のすべての詳細が表示されます。次に、2番目のクエリ結果を見てください。ここでは、150000ドル以上の給与カットオフに基づいて従業員とその経費を取得しました。このようにして、SUM、GROUP BY、およびHAVING句を使用したクエリが正しい結果を返すことを確認しました。
ユースケース5:複数の算術式を使用したSQLSUM関数
SUM関数は、算術式に関して非常に柔軟性があります。必要に応じて、複数の列の値を加算または減算するなど、複数の算術式を使用できます。例を見てみましょう。
従業員の総節約額に関するレポートを作成したいと思います。家賃手当、旅行手当、食事手当など、さまざまな経費または手当の列があります。私たちの表従業員 従業員の経費に関連する2つの列があります。宿泊費に支払われる家賃と政府に支払われる税金です。概念を理解し、同様の方法でより多くの列に適用できます。
USE DBName
GO
--List table data for reference
SELECT *
FROM [dbo].[Employee]
GO
--SUM with multiple arithmetic expressions
SELECT name, SUM(salary – (rent + tax)) AS [Total Savings]
FROM [dbo].[Employee]
GROUP BY name
GO
最初のクエリは、テーブル Employeeのすべてのデータを表示します 。このデータを参照として使用して、各従業員の総節約額に関する2番目のクエリによって返された実際の出力を確認します。
これは、すべての経費を加算してから、 SUM で指定されているように、従業員の給与からすべての経費を差し引くことで得られます。 関数ステートメント。従業員の最初の結果セットからこのデータを手動で計算して検証することで、検証できます。
結論
他の句を使用したSQLSUM関数の複数のユースケースを調査しました。ちなみに、SQL Serverスペシャリスト向けの最新のデジタルツールを使用すると、これらのタスクを大幅に簡素化できます。たとえば、dbForge SQL Completeには、SSMS結果グリッドの準備完了結果セットから集計関数を計算できる機能が含まれています。
SQLSUM関数に関連するお気に入りのヒントを共有できます。コメントセクションをご利用いただけます。