Mysql SUM с постановкой дела - PullRequest
13 голосов
/ 29 июля 2011
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.

Ответы [ 2 ]

27 голосов
/ 29 июля 2011

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

SELECT SUM(IF(cumulative = 1, `percent`, 0)) FROM phppos_items_taxes;
7 голосов
/ 29 июля 2011

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

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

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

...