【问题标题】:Converting ROLLUP to CUBE将 ROLLUP 转换为 CUBE
【发布时间】:2021-12-18 03:44:51
【问题描述】:

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

下面是ROLLUPCUBE的区别:

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 或其他东西来模拟带有 N 个变量汇总的 CUBE 函数?如果是这样,如何做到这一点?

【问题讨论】:

  • rollup(a,b,c)rollup(a,c) 都将生成 group by a 并且所有汇总都将生成总计。看起来递归 CTE 是可能的选项,但目前我无法编写这样的查询

标签: mysql sql postgresql


【解决方案1】:

你可以使用一个过程来生成你的 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
                

【讨论】:

  • @hi -- 谢谢,那是什么语言?另外,你如何使用 vargs 来做到这一点?
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 2014-10-06
  • 2011-10-26
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
相关资源
最近更新 更多