我的作业要求我找出“每个日期写了多少张发票?”
我有点卡住了,向我的教授寻求帮助。她给我发了一封电子邮件,询问可以回答这个问题,“每种类型和版本已经制造了多少炉子?对于一个挑战,但没有额外的积分,包括炉子的总数。”
这是她发给我的问题:
SELECT STOVE.Type + STOVE.Version AS 'Type+Version'
, COUNT(*) AS 'The Count'
FROM STOVE
GROUP BY STOVE.Type + STOVE.Version WITH ROLLUP;
所以,我调整了这个查询,直到它满足我的需要。这是我得出的结果:
SELECT InvoiceDt
, COUNT(InvoiceNbr) AS 'Number of Invoices'
FROM INVOICE
GROUP BY InvoiceDt WITH ROLLUP
ORDER BY InvoiceDt ASC;
它返回了我想要的结果。
无论如何,我决定仔细阅读ROLLUP子句,并从Microsoft中的一篇文章开始,文章中说ROLLUP子句类似于CUBE子句,但它与CUBE子句的区别如下:
- CUBE生成一个结果集,该结果集显示选定列中值的所有组合的聚合。
- ROLLUP生成一个结果集,该结果集显示选定列中值的层次结构的聚合。
所以,我决定用CUBE替换查询中的ROLLUP,看看会发生什么。它们产生了相同的结果。我想这就是我感到困惑的地方。
看起来,如果您使用的是我在这里所使用的查询类型,那么这两个子句之间没有任何实际差异。是这样吗?或者,我没有理解什么吗?当我阅读Microsoft文章时,我曾认为使用CUBE子句的结果应该有所不同。
5条答案
按热度按时间bxjv4tth1#
您不会看到任何差异,因为您只汇总了一列。
第一个月
对于
ROLLUP
,它将具有以下输出:对于
CUBE
,它将具有以下内容:CUBE
基本上包含每个节点的每种可能的汇总方案,而ROLLUP
将保持层次结构不变(因此它不会跳过MONTH而显示YEAR/DAY,而CUBE
会)这就是为什么您没有看到差异,因为您只有一个列要滚动。
kyks70gy2#
我们可以通过一个简单的例子来理解ROLLUP和CUBE之间的区别。假设我们有一个表,其中包含学生的季度测试结果。在某些情况下,我们需要看到与季度对应的总数以及学生。以下是示例表
1. ROLLUP(可以查找对应于一列的合计)
(a)得到每个学生在各方面的总成绩。
以下是(a)项的结果:
(b)如果你需要得到每个季度的总成绩
以下是(B)项的结果:
2. CUBE(在一个快照中查找季度总数和学生总数)
以下是
CUBE
的结果现在你可能想知道ROLLUP和CUBE的真实的使用。有时我们需要一个报表,其中我们需要看到每个季度的总数和每个学生在一个镜头的总数。这里是一个例子
我稍微修改了上面的CUBE查询,因为我们需要两个合计的总和。
现在,您将获得以下结果
jv4diomz3#
这是因为您只有一个作为分组依据的列。
添加
Group by InvoiceDt, InvoiceCountry
(或任何可以给予更多数据的字段)。使用Cube将为您提供每个InvoiceDt的Sum,您将获得每个InvoiceCountry的Sum。
sg24os4d4#
你可以找到更多关于GROUPING SET,CUBE,ROLL UP. TL; DR他们只是以某种方式扩展GROUP BY + UNION ALL来获得聚合:)
https://technet.microsoft.com/en-us/library/bb510427(v=sql.105).aspx
tktrz96b5#
所有投票的答案都是好的。
一个重要的区别是
1.立方体规格的N个元素对应于2^N个分组集。
Further reading see my article with respect to spark sql
例如:
商店ID、产品类型
汇总相当于
对于2(n)个按列分组的分组集,分组集具有(n +1)= 3个列组合
立方体相当于
对于按列分组的2(n)个分组集,分组集具有(2^n)= 4种列组合