Mysql总和相同但不同的条件

时间:2015-03-23 21:23:45

标签: php mysql

我有下表:

CREATE TABLE IF NOT EXISTS `data` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `amount` decimal(17,2) DEFAULT '0.00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=999999;

我希望从单个查询中返回所有记录的SUM,以及前100条记录的SUM。

现在我使用两个单独的查询:

SELECT COALESCE(SUM(amount),0) FROM data
SELECT COALESCE(SUM(amount),0) FROM data WHERE id<=100

我的想法与优化有关,因此UNION无法解决这个问题。 我在想像有两个变量的IF。

IF id<=100 THEN SUM1+=amount
IF id>0 THEN SUM2+=amount

但我不知道如何将上述内容翻译成MYSQL语言而没有任何错误。

3 个答案:

答案 0 :(得分:1)

这些查询总结了前100个,然后从第100行开始,直到任意大的数字,这将获得所有行。

select sum(a.amount) from (select amount from data limit 100) a
select sum(a.amount) from (select amount from data limit 100,999999999) a

您对这两个变量的想法不会导致优化,因为它很可能会在数据库引擎中采用较慢的路径。您可以将上面的两个查询合并到:

select (select sum(amount) from data limit 100) as acount, (select sum(amount) from data limit 100,999999999) as bcount from dual

但这可能不会更快,因为数据库无论如何都会在内部将其分解为两个查询。

答案 1 :(得分:1)

这个怎么样:

select sum(if(id <= 100, amount, 0)) as first_hundred,
       sum(if(id <= 100, 0, amount)) as rest
from data

这给你你想要的 - 对于每一行,如果id小于或等于100,金额总和为first_hundred,否则它被加总为休息。

整个表格的总和是first_hundred和rest的总和。

答案 2 :(得分:0)

您可以使用SUM语句执行此操作:

SELECT SUM(IF(`id` <= 100, `amount`, 0)) AS `hundred group`,
       SUM(IF(`id` >= 0, `amount`, 0)) AS `all`