【SQL実践|実務向け】SQLで数値の符号を気にしない!abs()関数で絶対値を取得する実践テクニック

データベースを運用する上で、数値データを扱う機会は非常に多いものです。特に、差分計算や比較を行う際に、負の値が混在していると意図しない結果を招くことがあります。そんな時に役立つのが、数値の絶対値を取得する `abs()` 関数です。今回は、この `abs()` 関数の基本的な使い方から、現場で役立つ応用例までを徹底解説します。

abs()関数とは?

`abs()` 関数は、引数として与えられた数値の絶対値(符号を取り除いた値)を返します。例えば、`abs(5)` は `5` を、`abs(-5)` は `5` を返します。数学で習う「絶対値」と同じ概念です。

SQLにおいて、`abs()` 関数は多くのデータベースシステム(MySQL, PostgreSQL, SQL Server, SQLiteなど)で標準的にサポートされています。

基本的な使い方

`abs()` 関数の基本的な構文は以下の通りです。

abs(数値またはカラム名)

引数には、直接数値を指定することも、数値が格納されているカラム名を指定することもできます。

例えば、以下のような `sales` テーブルがあるとします。

| product_id | sale_amount |
|—|—|
| 1 | 1500 |
| 2 | -800 |
| 3 | 2200 |
| 4 | -500 |

このテーブルの `sale_amount` カラムに格納されている売上金額の絶対値を取得したい場合は、以下のようにクエリを実行します。

SELECT
product_id,
sale_amount,
abs(sale_amount) AS absolute_sale_amount — sale_amountの絶対値を取得し、absolute_sale_amountという別名をつける
FROM
sales;

実行結果は以下のようになります。

| product_id | sale_amount | absolute_sale_amount |
|—|—|—|
| 1 | 1500 | 1500 |
| 2 | -800 | 800 |
| 3 | 2200 | 2200 |
| 4 | -500 | 500 |

このように、負の値が正の値に変換されていることがわかります。

NULL値や非数値データへの対応

`abs()` 関数は、引数に `NULL` を指定した場合、`NULL` を返します。また、数値に変換できない文字列などを指定した場合は、データベースシステムによって挙動が異なりますが、一般的には `0` や `NULL` を返すか、エラーが発生する可能性があります。

例として、以下のようなデータを含む `products` テーブルを考えます。

| id | price |
|—|—|
| 1 | 1000 |
| 2 | -500 |
| 3 | NULL |
| 4 | ‘Free’ |
| 5 | ‘-200’ |

ここで `price` カラムの絶対値を取得してみましょう。

SELECT
id,
price,
abs(price) AS absolute_price
FROM
products;

期待される実行結果 (一般的な動作)

| id | price | absolute_price |
|—|—|—|
| 1 | 1000 | 1000 |
| 2 | -500 | 500 |
| 3 | NULL | NULL |
| 4 | ‘Free’ | 0.0 (またはNULL、エラー) |
| 5 | ‘-200’ | 200 |

ID 4 の ‘Free’ については、数値として解釈できないため 0.0 (または NULL、あるいはエラー) となることが多いです。ID 5 の ‘-200’ は、文字列ですが数値として解釈可能なため、絶対値が計算されます。

実務では、このように予期しないデータが入る可能性も考慮し、`COALESCE` 関数や `CASE` 式と組み合わせて、`NULL` や不正な値を適切に処理することが重要です。

例えば、`NULL` の場合は 0 として扱いたい場合は、以下のように記述できます。

SELECT
id,
price,
abs(COALESCE(price, 0)) AS absolute_price — priceがNULLの場合は0として扱う
FROM
products;

応用例:差額の絶対値計算

`abs()` 関数は、2つの値の差額を常に正の値で取得したい場合に非常に便利です。例えば、ある期間の売上目標と実績の差を、プラス・マイナスに関わらず「差額」として把握したい場合などに使えます。

以下のような `performance` テーブルがあるとします。

| month | target_sales | actual_sales |
|—|—|—|
| 2023-01 | 100000 | 120000 |
| 2023-02 | 110000 | 105000 |
| 2023-03 | 130000 | 130000 |

各月の売上目標と実績の差額(絶対値)を計算するには、以下のクエリを実行します。

SELECT
month,
target_sales,
actual_sales,
abs(actual_sales – target_sales) AS sales_difference — 実績と目標の差額の絶対値
FROM
performance;

実行結果は以下のようになります。

| month | target_sales | actual_sales | sales_difference |
|—|—|—|—|
| 2023-01 | 100000 | 120000 | 20000 |
| 2023-02 | 110000 | 105000 | 5000 |
| 2023-03 | 130000 | 130000 | 0 |

このように、目標達成、未達に関わらず、どれだけ差があったのかを金額で把握することができます。

まとめ

`abs()` 関数は、数値の符号を無視してその大きさを取得するためのシンプルながら強力な関数です。データの整形、差額計算、条件分岐など、様々な場面で活用できます。データベースを扱う際には、ぜひこの `abs()` 関数を使いこなし、より柔軟で正確なデータ分析を行ってください。

コメント

タイトルとURLをコピーしました