SQL を使用したさまざまなパスの平均値の計算
MySQL では、データをグループ化して平均値を取得するには、AVG および GROUP BY を使用します。機能。ただし、特定の列のさまざまな値の平均を計算するなど、複数の条件を扱う場合、タスクは少し複雑になります。
この場合の目標は、「val」列の平均を抽出することです。一意の「id」ごとに、「pass」のさまざまな値(1 ~ 7 の範囲)を指定します。
サブクエリ ソリューション
1 つのアプローチは、次のサブクエリを使用することです。 AVG 関数内の「pass」の各値。これにより、「id」と「pass」の組み合わせごとに一連の値が返されます。
<code class="sql">SELECT d1.id, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 1) as val_1, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 2) as val_2, [...] (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 7) as val_7 from data_r1 d1 GROUP BY d1.id</code>
このクエリは、まず、「data_r1」テーブルから一意の「id」値を取得します。次に、「id」ごとに 7 つのサブクエリを実行して、「pass」の考えられる各値の平均値を計算し、それらを個別の「val_n」列として保存します。 IFNULL 関数は、サブクエリが NULL 値を返すあらゆるケースを処理し、結果が数値またはゼロであることを保証するために使用されます。
このアプローチの利点は、「id」ごとに 1 つの行を返すことです。結果を操作しやすくなります。ただし、特に 'pass' に使用可能な値が多数ある場合は、やや冗長になる可能性があります。
代替アプローチ
より簡潔な方法を希望する場合は、次のようにすることができます。 GROUP BY ステートメントと CASE ステートメントを組み合わせて使用すると、同様の結果が得られます。
<code class="sql">SELECT id, SUM(CASE WHEN pass = 1 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 1 THEN id END) AS val_1, SUM(CASE WHEN pass = 2 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 2 THEN id END) AS val_2, [...] SUM(CASE WHEN pass = 7 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 7 THEN id END) AS val_7 FROM data_r1 GROUP BY id</code>
このクエリでは、複数の CASE ステートメントを使用して 'pass' 値を評価し、対応する 'val' 値のみを計算に含めます。分母の COUNT(DISTINCT ...) 式により、特定の 'id' と 'pass' の組み合わせに複数の 'val' 値がある場合でも、平均が正しく計算されます。
もう一度、 IFNULL 関数を使用すると、除算の結果が NULL になるあらゆるケースを処理して、出力が数値またはゼロであることを確認できます。
どちらのアプローチを選択しても、これらのクエリは効果的に平均 'val' 値を抽出します。 「data_r1」テーブルの「pass」のさまざまな値に対する一意の各「id」。
以上がMySQL で SQL を使用してさまざまなパスの平均値を計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。