带有case语句的Mysql SUM

Chr*_*nch 13 mysql sql sum case

SELECT 
    SUM(
        CASE 
           WHEN cumulative = 1 
           THEN percent 
           ELSE 0 
        END) 
FROM phppos_items_taxes;
Run Code Online (Sandbox Code Playgroud)

鉴于上述声明,请执行以下操作:

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 |
+---------+-----------+---------+------------+
Run Code Online (Sandbox Code Playgroud)

这是累计= 1的每一行的累计百分比.如果累积!= 1则将0加总.

She*_*hef 28

是的,它确实!更简洁更清晰的查询(恕我直言)将使用IF声明:

SELECT SUM(IF(cumulative = 1, `percent`, 0)) FROM phppos_items_taxes;
Run Code Online (Sandbox Code Playgroud)

  • 更短,是的,但IF()语法不是ANSI SQL.使用CASE增加了便携性的机会,因为这是值得的. (4认同)

sll*_*sll 7

为什么不过滤掉物品?

SELECT 
    SUM(ISNULL(percent, 0)) 
FROM 
    phppos_items_taxes
WHERE 
    cumulative = 1
Run Code Online (Sandbox Code Playgroud)

在你的情况下,将选择每一行并且CASE必须应用语句,我相信使用WHERE过滤器会明显更快,因为WHERE子句在SELECT子句之前执行

  • @Chris Muench:如果查询不涉及其他因素,请使用此解决方案,确实要快得多.:) (2认同)