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

СУММУЛИРУЕТ ли это процент для каждой строки, в которой кумулятивно = 1. Если кумулятивно! = 1, то суммируется 0.


person Chris Muench    schedule 29.07.2011    source источник


Ответы (2)


Да, это так! Более короткий и чистый запрос (ИМХО) будет заключаться в использовании инструкции IF:

SELECT SUM(IF(cumulative = 1, `percent`, 0)) FROM phppos_items_taxes;
person Shef    schedule 29.07.2011
comment
Короче, да, но синтаксис IF() не соответствует ANSI SQL. Использование CASE увеличивает шансы быть портативным, чего бы это ни стоило. - person Bill Karwin; 29.07.2011
comment
+1. Я также использую этот синтаксис с mysql, но сумма AFAIK (случай, когда ... является более стандартным решением. редактировать. Когда я заканчиваю свой пост, я видел ответ Билла. :) - person Nicola Cossu; 29.07.2011
comment
@Билл: Да, ты прав. Я полностью согласен с тобой. Однако в MySQL есть так много вещей, которые не являются ANSI SQL, что не сделает код SQL, написанный для MySQL, переносимым по умолчанию. Скорее всего, когда возникнет вопрос переносимости, все запросы будут проверены, но здорово, что вы подняли этот вопрос, спасибо. :) - person Shef; 29.07.2011
comment
Да, я согласен, что портативность неуловима и не всегда стоит того. - person Bill Karwin; 29.07.2011

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

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

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

person sll    schedule 29.07.2011
comment
@Chris Muench: Если запрос не включает другие факторы, используйте это решение, оно действительно намного быстрее. :) - person Shef; 29.07.2011