0

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

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?

4

2 回答 2

1

MySQL中没有这样的分析功能。您将不得不帮助自己处理子查询。

您可以编写一个 UDF 来帮助您解决该问题,但这更加复杂。您将不得不进行一些 C/C++ 编程。

查看http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html

不要尝试直接在 MySQL 中实现函数。它会像地狱一样缓慢。如果你创建一个函数,它必须是一个 UDF 插件。

于 2013-11-14T10:29:52.717 回答
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 的使用有一些限制,您可以在官方文档中查找

于 2013-11-14T10:34:35.250 回答