首页 > 解决方案 > 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 ...

标签: mysqlsql

解决方案


问题实际上是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,说明此方法确实计算了方差(尽管在工作查询中)。


推荐阅读