web-dev-qa-db-ja.com

ケースステートメントを含むMysqlSUM

SELECT 
    SUM(
        CASE 
           WHEN cumulative = 1 
           THEN percent 
           ELSE 0 
        END) 
FROM phppos_items_taxes;

上記のステートメントが与えられた場合、これは次のことを行います。

mysql> select * FROM phppos_items_taxes;
+---------+-----------+---------+------------+
| item_id | name      | percent | cumulative |
+---------+-----------+---------+------------+
|       1 | Tax 1     |    8.00 |          0 |
|       1 | Tax 2     |   10.00 |          1 |
|       3 | Sales Tax |    8.00 |          0 |
|       4 | Tax 1     |   20.00 |          0 |
|       4 | Tax 2     |   20.00 |          0 |
+---------+-----------+---------+------------+

これは、累積= 1である各行のパーセントを合計しますか?累積!= 1の場合、0が合計されます。

13
Chris Muench

はい、そうです!より短く、よりクリーンなクエリ(IMHO)は、IFステートメントを使用することです。

SELECT SUM(IF(cumulative = 1, `percent`, 0)) FROM phppos_items_taxes;
28
Shef

アイテムを除外しないのはなぜですか?

SELECT 
    SUM(ISNULL(percent, 0)) 
FROM 
    phppos_items_taxes
WHERE 
    cumulative = 1

あなたの場合、各行が選択され、CASEステートメントを適用する必要があります。WHEREフィルターを使用すると、SELECT句の前にWHERE句が実行されるであるため、大幅に高速になると思います。

7
sll