ホームページ >データベース >mysql チュートリアル >「SUM IF」と「COUNT IF」を直接サポートせずに、MySQL はどのようにして条件付き集計を効果的に実現できるのでしょうか?

「SUM IF」と「COUNT IF」を直接サポートせずに、MySQL はどのようにして条件付き集計を効果的に実現できるのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-15 00:58:02712ブラウズ

How can MySQL effectively achieve conditional aggregations without direct support for 'SUM IF' and 'COUNT IF'?

エレガントなソリューション: MySQL の 'SUM IF' と 'COUNT IF' の制限を克服する

それらは便利であるにもかかわらず、MySQL には直接サポートがありません。 「SUM IF」および「COUNT IF」関数の場合。この制限は、条件付き集計を扱うときにイライラすることがよくあります。ただし、CASE ステートメントを使用した洗練された解決策があります。

次のシナリオを考えてみましょう:

| id | hour | kind |
|---|---|---|
| 1 | 10 | 1 |
| 2 | 15 | 2 |
| 3 | 20 | 1 |
| 4 | 25 | 3 |

目的は次を計算することです:

  • レコードの総数
  • 合計時間数
  • 「kind」が 1 に等しいレコードの数

元の試行と MySQL の応答:

「SUM( IF(...) )」または「COUNT( IF(...) )」を使用した最初の試行ではエラーが発生します。 MySQL では、集計関数と「IF」のような制御構造を混在させることはできません。

CASE ステートメントを使用した解決策:

CASE ステートメントは、動的に評価して返す条件式を提供します。価値観。これを使用すると、目的の条件付き集計を効果的に実現できます。方法は次のとおりです:

SELECT count(id), 
    SUM(hour) as totHour, 
    SUM(case when kind = 1 then 1 else 0 end) as countKindOne

このクエリは次の操作を実行します:

  • count(id): レコードの合計数をカウントします。
  • SUM(hour) : 合計時間数を計算します。
  • SUM(case when kind = 1 then 1 else 0 end): CASE ステートメントを使用して、'kind' が 1 に等しいレコードの数を条件付きでカウントします。

出力:

| count(id) | totHour | countKindOne |
|---|---|---|
| 4 | 70 | 2 |

CASE ステートメントを利用することで、MySQL の 'SUM IF' と 'COUNT IF' の制限をエレガントに克服でき、効率的な条件付き集計。

以上が「SUM IF」と「COUNT IF」を直接サポートせずに、MySQL はどのようにして条件付き集計を効果的に実現できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。