合計行数に対する行(または行のグループ)の相対的な寄与を確認したい場合がよくあります。つまり、行が合計数の何パーセントかを示します。説明のために、Navicat Premium 16で表示される次の表を見てみましょう。
count()関数をGroup By句と組み合わせることで、果物の種類ごとに受け取った注文の数を簡単に見つけることができます。
では、それぞれの果物の注文が注文の総数に何パーセント寄与したかをどのように見るのでしょうか?実際、SQLで行のパーセンテージを計算する標準的な方法は3つあります。それらは、
- OVER()句の使用
- サブクエリの使用
- 共通テーブル式(CTE)の使用
このブログの残りの部分では、これらのそれぞれについて順番に説明します。
OVER()句
主にウィンドウ関数で使用されるOVER句は、クエリのどの行が関数に適用されるか、その関数によってどの順序で評価されるか、関数の計算をいつ再開するかを決定するために使用されます。
OVER句は、SQLで行のパーセンテージを計算するための最も効率的な方法であるため、効率を優先する場合は、これを最初に選択すべきです。パーセンテージを取得する式は次のとおりです。
count(*) * 100.0 / sum(count(*)) over()
上記のSQLを弊社のオリジナルのクエリに追加すると、次の結果が生成されます。
見た目は良さそうですが、多少の丸めは問題ないでしょう。残念ながら、これはover()句を使用して簡単に行うことはできません。おそらく、次のオプションがあなたの好みに合うでしょう。
サブクエリの使用
全てのデータベースがOVER()句をサポートしているわけではないため、サブクエリアプローチは非常に価値のあるフォールバックソリューションになる可能性があります。全てのデータベースで機能するため、「ユニバーサルソリューション」と呼ばれることもあります。このアプローチのもう1つの利点は、それはRound()などの関数に組み込むのが最も簡単なことです。クエリに追加する必要があるのは、次のとおりです。
count(*) * 100.0 / (select count(*) from <YourTable>)
そして、実際のユニバーサルソリューションは次のとおりです。
共通テーブル式(CTE)の使用
With common_table_expression句は、共通テーブル式(CTE)と呼ばれる一時的な名前付き結果セットを指定します。次に、一時的な結果セットから選択して、取得したフィールドにさらに多くの関数を適用できます。この場合、sum()関数をカウントに適用して、パーセンテージを取得できます。
CTEは基本的に内部(初期)クエリの結果に対して2番目のクエリを実行するため、このアプローチは最も効率が悪いことに注意してください。そうは言っても、CTEを使用して、一度に簡単に実行できない追加の処理を実行する必要がある場合はあるでしょう。
結論
このブログでは、合計行数に対する行(または行のグループ)の相対的な寄与をパーセンテージで表す3つの方法を学びました。それぞれのアプローチには独自の長所と短所があるため、特定の要件に基づいていずれかを選択する必要があります。
Navicat 16を試してみたい方は、こちらからNavicatの14日間の完全版の無料トライアルをダウンロードできます。