2016-01-24 52 views
1

我在Oracle上ROLAP工作,我有這個事實表: 銷售(market_id,ITEM_ID,銷售),我有這個疑問:如何在oracle中編寫沒有「Cube」功能的查詢?

SELECT market_id,item_id,SUM(sale) FROM Sales 
GROUP BY CUBE(market_id,item_id); 

是否有另一種方式來獲得相同的結果,但沒有使用「CUBE」功能?

回答

1

查詢下面的te等同於使用CUBE(market_id,item_id)子句(給出相同結果集)的查詢。
但它會更慢,它會讀取表4次 - CUBE進行了優化,它只讀取一次表。

SELECT market_id,item_id,SUM(sale) 
FROM Sales 
GROUP BY market_id,item_id 
UNION ALL 
SELECT market_id,NULL,SUM(sale) 
FROM Sales 
GROUP BY market_id,NULL 
UNION ALL 
SELECT NULL,item_id,SUM(sale) FROM Sales 
GROUP BY NULL,item_id 
UNION ALL 
SELECT NULL, NULL,SUM(sale) 
FROM Sales 
GROUP BY NULL, NULL 
1

您還可以通過使用grouping_sets解決它從聚集功能

,它會給你同樣的結果

SELECT market_id,item_id,SUM(sale) FROM Sales 
    Group by GROUPING SETS ((market_id,item_id) , (market_id)(item_id),());