2011-07-29 29 views
12
SELECT 
    SUM(
     CASE 
      WHEN cumulative = 1 
      THEN percent 
      ELSE 0 
     END) 
FROM phppos_items_taxes; 

这是否做到以下几点:Mysql的SUM有鉴于上述声明case语句

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相加! 。

回答

25

是的! 更短和更清洁的查询(恕我直言)是使用IF声明:

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

短,是的,但IF()语法不是ANSI SQL。使用CASE增加了移植的可能性,因为这是值得的。 –

+0

+1。我也使用这种语法与MySQL,但AFAIK“sum(case when ...)”是一个更标准的解决方案编辑当我结束我的帖子,我已经看到比尔的答案:) –

+0

@ Bill:是的,你说得对。我完全同意你的看法。但是,MySQL中有很多不是ANSI SQL的东西,它们不会为默认情况下为可移植的MySQL编写SQL代码。有机会,当可移植性来质疑所有的查询将被检查,但它是伟大的,你提出了,谢谢。 :) – Shef

7

为什么不直接过滤掉的项目?

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

在你的情况下,每个行会选择和CASE声明已被应用,相信随着WHERE过滤器这将是显著更快,因为WHERE子句SELECT子句前执行

+2

@Chris Muench:如果查询不涉及其他因素,请使用此解决方案,确实速度更快。 :) – Shef