2015-09-01 59 views
2

我想驗證我的理解基於一個示例,因爲這將用於構建我的項目的等效查詢。這是https://oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets#grouping_setsOracle - GROUPING_ID與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. 我可以說,會有兩個subtototals,與第一組羣由FACT_1_ID, FACT_2_ID,另一組由FACT_1_ID, FACT_3_ID

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

  3. 在從點2繼續由於GROUPING_ID 1指的是基團由FACT_1_ID, FACT_2_ID,因此柱FACT_3_ID保持NULL,因爲它是不被用作GROUP BY子句。

我的理解是否正確?

回答

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」表示在分組過程中哪個列已被空值替換。
可以理解嗎?

+0

這是否意味着'1'表示GROUP BY子句會忽略/忽略該特定列?即含義所有'0'將被包含在group by子句中以生成小計。 感謝您深入瞭解幕後真正發生的事情。有助於理解! – user1008697