[英]Oracle - GROUPING_ID with GROUPING SETS
我想根据示例验证我的理解,因为这将用于为我的项目构建等效查询。 这是引用自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;
根据上面的查询,
我可以说会有两个小计,第一个是按FACT_1_ID, FACT_2_ID
,另一个是按FACT_1_ID, FACT_3_ID
吗?
1 的GROUPING_ID
指的是按FACT_1_ID, FACT_2_ID
? 而 2 的GROUPING_ID
指的是按FACT_1_ID, FACT_3_ID
?
继续第 2 点。由于GROUPING_ID
for 1 指的是 group by FACT_1_ID, FACT_2_ID
,因此列FACT_3_ID
保持为NULL
因为它没有被用作GROUP BY
子句。
我的理解正确吗?
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”的位置表示分组期间哪一列已被空值替换。
可以理解吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.