Oracle - GROUPING_ID与GROUPING SETS

时间:2015-09-01 11:48:17

标签: sql oracle oracle10g

我想基于一个示例验证我的理解,因为这将用于为我的项目构造一个等效的查询。这是引自https://oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets#grouping_sets

的示例
SELECT fact_1_id,
       fact_2_id,
       fact_3_id,
       SUM(sales_value) AS sales_value,
       GROUPING_ID(fact_1_id, fact_2_id, fact_3_id) AS grouping_id
FROM   dimension_tab
GROUP BY GROUPING SETS((fact_1_id, fact_2_id), (fact_1_id, fact_3_id))
ORDER BY fact_1_id, fact_2_id, fact_3_id;

基于上面的查询,

  1. 我可以说会有两个小计,第一个是FACT_1_ID, FACT_2_ID分组,另一个分组是FACT_1_ID, FACT_3_ID吗?

  2. 1的GROUPING_ID是指FACT_1_ID, FACT_2_ID分组?而GROUPING_ID for 2指的是FACT_1_ID, FACT_3_ID

  3. 从第2点开始继续。由于1 {1}}引用GROUPING_ID分组,因此FACT_1_ID, FACT_2_ID列仍为FACT_3_ID不被用作NULL条款。

  4. 我的理解是否正确?

1 个答案:

答案 0 :(得分:2)

GROUPING_ID由此公式计算。 BIN_TO_NUM(grouping(fact_1_id),GROUPING(fact_2_id),GROUPING(fact_3_id))

Bin_to_num将二进制值转换为数字。
你可以做反向计算。
如果GROUPING_ID = 1 => BIN_TO_NUM(0,0,1)= 1 - > fact_3 = null
如果GROUPING_ID = 2 => BIN_TO_NUM(0,1,0)= 2 - > fact_2 = null
" 1"的位置指示在分组期间哪个列已被替换为null 这可以理解吗?