【问题标题】:Oracle - GROUPING_ID with GROUPING SETSOracle - GROUPING_ID 和 GROUPING SETS
【发布时间】:2015-09-01 11:48:16
【问题描述】:

我想根据一个示例来验证我的理解,因为这将用于为我的项目构建等效查询。这是引用自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 分组?而 2 的 GROUPING_ID 指的是 FACT_1_ID, FACT_3_ID 分组?

  3. 从第 2 点继续。由于 1 的 GROUPING_ID 指的是按 FACT_1_ID, FACT_2_ID 分组,因此列 FACT_3_ID 仍然是 NULL,因为它没有被用作 GROUP BY 子句。

我的理解正确吗?

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    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”的位置表示在分组过程中哪一列被空替换。
    可以理解吗?

    【讨论】:

    • 这是否意味着“1”意味着 GROUP BY 子句将忽略/忽略该特定列?即意味着所有的“0”都将包含在 group by 子句中以生成小计。感谢您深入了解幕后真正发生的事情。对理解有很大帮助!
    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多