HOWTO · MySQL

MySQL でパーセンテージを計算する

このチュートリアルでは、1つまたは複数の列を使用して MySQL でパーセンテージを計算するさまざまな方法について説明します。

このページの内容

MySQL で割合を計算するには、部分を全体で割って100を掛けます。式は (part / whole) * 100 です。分母によって結果の意味が決まります。各行の割合なら全行の合計、比率なら比較対象の列、グループごとの割合ならグループ全体の合計を分母にします。以下の例では、それぞれの計算方法と結果の丸め方や表示方法を説明します。

合計に対する各行の割合を計算する

sales テーブルに ID、RepresentativeName、Sale の各列があり、売上が 15、15、30 だとします。合計は 60 なので、各行の割合は 25%、25%、50% です。サブクエリで合計を一度だけ計算し、その1行の結果を CROSS JOIN で各売上行と結合します。クエリは SELECT s.RepresentativeName, s.Sale, ROUND(s.Sale * 100.0 / totals.SalesSum, 2) AS Percentage FROM sales AS s CROSS JOIN (SELECT SUM(Sale) AS SalesSum FROM sales) AS totals; です。100.0 を使うことで、整数除算に頼らず小数として割合を計算できます。ROUND(..., 2) は数値の結果を小数点以下2桁に丸めます。最初の売上について同じ計算を確認するには、次の小さな例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

sale = 15
total = 60
percentage = sale * 100 / total
print(f"{percentage:.2f}%")

比率に意味を持たせるには、合計がゼロでない必要があります。売上がない場合や合計がゼロになる可能性がある場合は、分母に NULLIF(totals.SalesSum, 0) を使うなどして、その条件を明示的に処理してください。

2列から割合を計算する

行ごとの比率を求めるには、その行の分子を分母で割ります。tests に GroupName、EmployeesCount、SurveysCount の各列がある場合、アンケート回答の割合は SurveysCount / EmployeesCount * 100 です。たとえば、従業員200人のうち10人が回答した場合、割合は5%です。クエリは SELECT GroupName, EmployeesCount, SurveysCount, ROUND(SurveysCount * 100.0 / NULLIF(EmployeesCount, 0), 2) AS Percentage FROM tests; です。NULLIF により従業員数がゼロの場合は NULL になり、ゼロ除算を行わずに済みます。このクエリでは COUNT() も GROUP BY も必要ありません。各行に比較対象となる2つの値がすでにあるためです。複数レコードから値を集計する場合は、まず分子と分母をどう定義するか決め、その後、それぞれを一貫した方法で集計します。

ウィンドウ関数で各グループの合計に対する割合を計算する

各仕入先が全商品のうちどれだけを占めるかを求めるには、まず仕入先ごとに商品数を数え、次に各グループの商品数をグループ全体の商品数で割ります。ウィンドウ集計を使うと、グループ化された各行に全体の合計を適用できます。クエリは SELECT SupplierID, COUNT(*) AS ProductCount, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS SupplierPercentage FROM products GROUP BY SupplierID; です。内側の COUNT(*) は仕入先ごとの商品数で、SUM(COUNT(*)) OVER () はグループ化された行をまとめずに、それらの件数を合計します。商品が6個あり、各仕入先の商品数が2、1、3個なら、割合は33.33%、16.67%、50.00%です。この分母はクエリのグループ行が表す合計なので、フィルターはグループと全体の合計の両方に影響します。このクエリを実行するには MySQL のウィンドウ関数への対応が必要です。使用環境で対応しているか確認したい場合は、サーバーのドキュメントを参照してください。

割合の結果を丸めて表示する

ROUND(value, 2) は数値関数で、値を小数点以下2桁に丸めます。並べ替え、比較、または後続の計算に使う場合は、値を数値のまま保持してください。MySQL の結果にパーセント記号を表示するには CONCAT(ROUND(value, 2), '%') を使います。これは数値の割合ではなく文字列を返すため、数値の表示形式のように末尾のゼロが保持されるとは限りません。問いに合わせて分母を選びます。各行の割合にはテーブル全体の合計、比率には別の列、グループごとの割合にはグループ行の合計を使います。いずれの場合も小数演算を使い、分母がゼロの場合にアプリケーションでどう扱うかを決めてください。