我有下表:
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语言而没有任何错误。
答案 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`