首页 > 解决方案 > 将 ROLLUP 转换为 CUBE

问题描述

假设我们可以访问GROUP BY ROLLUP但不能访问(例如,如果我们想象在旧版本中不存在GROUP BY CUBE,则在 mysql 甚至 postgres中)。CUBE

ROLLUP下面显示和之间的区别CUBE

ROLLUP (a, b, c)
(a, b, c)
(a, b)
(a)
()
CUBE (a, b, c)
(a, b, c)
(a, b)
(a, c)
(a)
(b, c)
(b)
(c)
()

如果CUBE不是一个选项,那么将ROLLUP函数映射为的正确方法是CUBE什么?似乎会是:

ROLLUP (a,b,c) UNION ALL
ROLLUP (a,  c) UNION ALL
ROLLUP (  b,c) UNION ALL
ROLLUP (    c)

这是正确的理解吗?如果是这样,是否可以使用递归 CTE 或其他东西来模拟CUBE具有 N 个变量汇总的函数?如果是这样,如何做到这一点?

标签: mysqlsqlpostgresql

解决方案


你可以使用一个过程来生成你的 sqls

您可以尝试以下伪程序

   Create procedure Rollup(a, b) 
     As
     Begin 
     For i in [a, b, c]    -- or whatever array you may have
          For j! =i
                 Rollup(i, j) 
                 End loop;
      End loop;
    END
                

推荐阅读