MySQL:每组和整体的总和

时间:2013-11-14 10:10:25

标签: mysql

对于一个项目我有一个查询汇总数据:

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?

2 个答案:

答案 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

中查找