对于一个项目我有一个查询汇总数据:
SELECT
code,
SUM(someValue) as summedValueForCode
FROM
someTable
GROUP BY
code;
现在,我需要的是第三列,它定义summedValueForCode代表所有行的%。所以summedValueForCode / summedValueForAllRows。
我可以这样做:
SELECT
code,
SUM(someValue) as summedValueForCode,
(100 * SUM(someValue) / (SELECT sum(someValue) FROM someTable)) as valueForCodeToTotal
FROM
someTable
GROUP BY
code;
但它看起来并不优雅。
另一种选择是:
SELECT
code,
SUM(someValue) as summedValueForCode,
(100 * SUM(someValue) / totalSum) as valueForCodeToTotal
FROM
someTable,
(SELECT sum(someValue) as totalSum FROM someTable) as summedTable
GROUP BY
code;
但是,由于真正的查询非常复杂,我不喜欢第二次添加查询的想法。
有没有办法使用聚合函数来计算忽略GROUP的所有行的SUM?
答案 0 :(得分:1)
在MySQL中没有这样的分析功能。 您必须自己使用子查询。
您可以编写一个可以帮助解决该问题的UDF,但这更复杂。你必须做一些C / C ++编程。
查看http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html
不要试图直接在MySQL中实现一个函数。地狱会很慢。如果您创建一个函数,它必须是一个UDF插件。
答案 1 :(得分:0)
SELECT
code,
SUM(someValue) as summedValueForCode
FROM
someTable
GROUP BY
code
WITH ROLLUP # here is where the magic happens
你会得到像这样的输出
code - summedValueForCode
A 100
B 200
C 50
null 350
将代码过滤为null,您将获得所需的总数。
请注意,使用WITH ROLLUP有一些限制,您可以在official documentation
中查找