Mysql 按多行总和/或嵌套总和排序?
Mysql order by sum of multiple rows / or nested sum?
我不知道如何为我的问题找到合适的标题。我希望它以某种方式清楚我的意思。
我有如下查询:
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
它 returns 正是我所期望的:
CAT2 Characteristic #2 4
CAT3 Characteristic #1 3
CAT2 Characteristic #1 3
CAT2 Characteristic #3 1
CAT3 Characteristic #3 1
但我想做的是创建某种带有堆积条形图的帕累托图,它具有 x-axis 上的特征、y-axis 上的错误以及类别堆叠起来。
然而,这个结果意味着#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
提前致谢
假设您使用的是 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 8.0 中,使用 Tim Biegeleisen 演示的 window 函数。在 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
我不知道如何为我的问题找到合适的标题。我希望它以某种方式清楚我的意思。 我有如下查询:
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
它 returns 正是我所期望的:
CAT2 Characteristic #2 4
CAT3 Characteristic #1 3
CAT2 Characteristic #1 3
CAT2 Characteristic #3 1
CAT3 Characteristic #3 1
但我想做的是创建某种带有堆积条形图的帕累托图,它具有 x-axis 上的特征、y-axis 上的错误以及类别堆叠起来。
然而,这个结果意味着#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
提前致谢
假设您使用的是 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 8.0 中,使用 Tim Biegeleisen 演示的 window 函数。在 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