我已经看到了一些建议,但想知道从数据表中选择组、组总计、总计的最佳方法,而不使用子查询或不必要的连接。
我最初的想法是这样的:
select product_family,
sum(widgets),
sum(widgets) over ()
from table.widget
group by product_family
或以下内容:
select product_family,
sum(widgets),
sum(widgets) over (partition by all_field)
from table.widget
group by product_family
显然这些都不起作用。我知道一个分区可以比实际的行/组具有更高的顺序,但不是如何按“全部”进行分区,而不是将其留空作为第一个示例。但是,它与 group by 语句中断。
我能找到的最好的是这样的:
select product_family,
family_sum,
sum(family_sum) over () as grand_sum
from (
select product_family, sum(widgets)
from table.widget
group by product_family
) as A
不过,这仍然涉及一个子查询,这没关系。我只是觉得我在这里缺少一个简单的功能。
GROUP BY ROLLUP
做你想做的事。举个例子:
这会产生以下输出:
前
NULL
两列中显示的表示累计金额。为了使它“漂亮”,您可以使用一些替代值来代替
NULL
汇总值:GROUP BY ROLLUP
或者 - 甚至更好 -GROUP BY GROUPING SETS
如果您想要一个额外的总计行是最好的。如果您想要每一行的总计 - 在另一列中 - 那么您的查询需要进行微调。
SUM(widgets)
您可以在窗口函数中使用聚合: