Подтвердить что ты не робот

Mysql SUM с аргументом case

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 |
+---------+-----------+---------+------------+

Этот SUM увеличивает процент для каждой строки, которая является кумулятивной = 1. Если кумулятивный!= 1, то 0 суммируется.

4b9b3361

Ответ 1

Да, да! Более короткий и более чистый запрос (IMHO) должен был бы использовать инструкцию IF:

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

Ответ 2

Почему бы просто не отфильтровать элементы?

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

В вашем случае каждая строка будет выбрана, и оператор CASE должен быть применен, я считаю, что с фильтром WHERE это будет значительно быстрее, потому что выражение WHERE выполняется перед предложением SELECT