Mysql按多行总和/或嵌套总和排序?

Posted

技术标签:

【中文标题】Mysql按多行总和/或嵌套总和排序?【英文标题】:Mysql order by sum of multiple rows / or nested sum? 【发布时间】:2021-03-27 14:02:27 【问题描述】:

我不知道如何为我的问题找到合适的标题。我希望以某种方式清楚我的意思。 我有如下查询:

SELECT
    p.category,
    p.characteristic,
    SUM(p.amount) AS errors
FROM testtable p
WHERE [...]
GROUP BY
    p.characteristic,
    p.category
ORDER BY
    errors DESC,
    p.characteristic ASC

它返回的正是我所期望的:

CAT2    Characteristic #2   4
CAT3    Characteristic #1   3
CAT2    Characteristic #1   3
CAT2    Characteristic #3   1
CAT3    Characteristic #3   1

但我想做的是创建某种带有堆叠条形的帕累托图,它在 x 轴上有特征,在 y 轴上有错误,并且类别会被堆叠起来。

但是,这个结果意味着#2 是第一个有 4 个错误,#1 是第二个有 6 个错误,这是不正确的。

我需要的是一个查询,该查询按特征的错误总和对结果进行排序。这有可能吗?

这是我期望的一个例子:

CAT3    Characteristic #1   3
CAT2    Characteristic #1   3
CAT2    Characteristic #2   4
CAT2    Characteristic #3   1
CAT3    Characteristic #3   1

#1 是第一位的,因为它的错误之和是 6,#2 是第二位,因为总和是 4,最后是 #3,因为总和是 2

提前致谢

【问题讨论】:

请以表格形式包含您想要查看的确切输出。 @TimBiegeleisen 我更新了一些解释 【参考方案1】:

mysql 8.0 中,使用 Tim Biegeleisen 演示的窗口函数。在 MySQL 5.x 中,一种替代方法在 ORDER BY 子句中使用相关子查询:

SELECT p.`category`, p.`characteristic`, sum(p.`amount`) AS `errors`
FROM `testtable` p
WHERE [...]
GROUP BY p.`characteristic`, p.`category`
ORDER BY (
    SELECT SUM(p1.amount)
    FROM `testtable` p1
    WHERE [...] AND p1.`characteristic` = p.`characteristic`
) DESC

【讨论】:

【参考方案2】:

假设您使用的是 MySQL 8+,您的预期输出很容易通过使用分析函数得到:

SELECT p.category, p.characteristic, SUM(p.amount) AS errors
FROM testtable p
WHERE [...]
GROUP BY p.category, p.characteristic
ORDER BY SUM(SUM(p.amount)) OVER (PARTITION BY p.characteristic) DESC;

在旧版本的 MySQL 上,我们可能需要做更多的工作:

SELECT t1.category, t1.characteristic, t1.errors
FROM
(
    SELECT p.category, p.characteristic, SUM(p.amount) AS errors
    FROM testtable p
    WHERE [...]
    GROUP BY p.category, p.characteristic
) t1
INNER JOIN
(
    SELECT p.characteristic, SUM(p.amount) AS total_errors
    FROM testtable p
    WHERE [...]
    GROUP BY p.characteristic
) t2
    ON t1.characteristic = t2.characteristic
ORDER BY
    t2.total_errors DESC;

【讨论】:

这很有趣。我还没有太多地使用这些功能。旧版本的mysql有办法吗?目前我们在谷歌云上有一个旧版本。 查看更新后的答案,了解应该在早期版本的 MySQL 上运行的版本。 好吧,这就是我所担心的。那我得看看能不能升级mysql

以上是关于Mysql按多行总和/或嵌套总和排序?的主要内容,如果未能解决你的问题,请参考以下文章

在嵌套对象中获取总和

如何对 Solr 中的多个字段执行嵌套聚合?

使用 lambda 函数在嵌套列表中查找总和

使用Javascript的数组中嵌套对象值的总和

Google BigQuery 选择记录中所有嵌套字段的总和

MongoDB:嵌套数组的总和