mysql - ROLLUP 不适用于具有两个聚合值的数学运算的列
问题描述
所以我在下面有一个简化的代码:
SELECT
(
t1.name,
t1.shortName,
(
SUM(
CASE WHEN condition1 THEN t1.qty
WHEN condition2 THEN t1.qty * t1.multiplier
END)
-
SUM(
(SELECT (
CASE WHEN condition1 THEN t2.qty
WHEN condition2 THEN t2.qty * t2.multiplier
END) AS count
FROM table t2))
) AS variance
FROM table t1
GROUP BY t1.name, t1.shortName WITH ROLLUP
在上面的代码中,除总计/小计行外,方差显示每行的正确金额。谷歌搜索后,事实证明 WITH ROLLUP 仅适用于聚合的列,因此上述方法不起作用,因为方差的值更像是常数,因为 SUM 在其中...
所以我试图将代码重写为:
SELECT
(
t1.name,
t1.shortName,
SUM(
CASE WHEN condition1 THEN t1.qty
WHEN condition2 THEN t1.qty * t1.multiplier
END
-
(SELECT (
CASE WHEN condition1 THEN t2.qty
WHEN condition2 THEN t2.qty * t2.multiplier
END) AS count
FROM table t2)
) AS variance
FROM table t1
GROUP BY t1.name, t1.shortName WITH ROLLUP
而且它不工作....基本上我想做的是聚合表1和表2中的值,然后在它们之间执行数学运算,将结果显示在列中,然后进行ROLLUP ...
解决方案
问题实际上是CASE
表达式,而不是算术。一种解决方法是计算子查询中的未聚合值:
SELECT t1.name, t1.shortName,
SUM(t1_cond) - SUM(t2_cond) AS variance
FROM (SELECT t1.*,
(CASE WHEN condition1 THEN t1.qty
WHEN condition2 THEN t1.qty * t1.multiplier
END) as t1_cond,
(CASE WHEN condition1 THEN t2.qty
WHEN condition2 THEN t2.qty * t2.multiplier
END) as t2_cond2
FROM t1
) t1
GROUP BY t1.name, t1.shortName WITH ROLLUP;
这是一个 db<>fiddle,说明此方法确实计算了方差(尽管在工作查询中)。
推荐阅读
- java - 忽略正则表达式术语的拆分?
- javascript - 在javascript中实现这个数学方程
- perl - \x{..} 和 \N{U+..} 之间有区别吗
- scala - 如何组合两个对象元素
- ios - 使用来自 ObjC 的 swift 对象的内存泄漏
- post - 连接期间更改用户代理
- mysql - 使用非主键表进行查询+在中间添加一行?
- django - 类型错误:autodiscover_tasks() 缺少 1 个必需的位置参数:“包”。芹菜
- c++ - 写入的字节数为 0,尽管 getOverlappedResult 返回 1
- swift - Swift - 如何在泛型函数中获取数组元素的类型