2012-08-22 39 views
0

我需要選擇不同粒度級別的數據(在Oracle中)。我有一個表的數據爲:選擇不同粒度級別的數據(Oracle中的分組集合)

c1 c2 c3 c4 
a a1 10 5 
a a2 10 5 
b b1 10 5 
b b2 10 5 

我需要編寫一個查詢,將返回的數據爲:

c1 c2 c3 
a 20 10 --aggregated data 
a1 10 5 --lowest granular level data 
a2 10 5 --lowest granular level data 
b 20 10 
b1 10 5 -- data of b1, b2 should follow the data of b; likewise a1, a2 should follow data of a 
b2 10 5 

我覺得這是相當不尋常的,因爲我需要選擇在兩個最低粒度級別的數據和一個彙總的水平。我怎樣才能做到這一點?

+1

我沒有看到新訂單的任何邏輯... – alfasin

+0

您是否嘗試過在Oracle中使用CONNECT BY運算符。 不確定使用情況,但聽到它有幫助,而結果包含層次結構 – rshetye

回答

1

你可以從這個開始:

SELECT C1, C2, sum(c3), sum(c4), grouping_id(c1, c2) 
FROM table_name 
group by rollup(c1,c2) 

若要僅獲取您的羣組,您需要

SELECT C1, C2, sum(c3), sum(c4), grouping_id(c1, c2) 
FROM table_name 
group by GROUPING SETS ((c1, c2), c1) 

看到here另一個例子,解釋。

+0

你確切地得到了我的問題。但我試圖選擇c1或c2,因爲我需要爲最低級別的數據選擇c2,併爲彙總的數據選擇c1。 – chemicalkt

+0

我說這是一個開始。你可以'SELECT nvl(c2,c1),sum(c3),sum(c4)' –

+0

我有問題要訂購我的數據。使用'c1 asc命令,grouping(c2)desc'以'a'' a2''a1''b'' b2''b1'的順序給出數據。在使用'c1 asc命令時,分組(c2)asc'按照'a1''a2''a''b1''b2''b'的順序給出數據,但我需要按照'a'' a1' 'a2''b''b1''b2'。 – chemicalkt

2

很難確定,因爲您沒有告訴我們如何從一個數據集到另一個數據集。我的猜測,不過,是你想要的東西像

SELECT c1, sum(c3) c2, sum(c4) c3 
    FROM table_name 
GROUP BY c1 
UNION ALL 
SELECT c2, sum(c3), sum(c4) 
    FROM table_name 
GROUP BY c2; 
+0

你有我的問題,但我需要保持秩序。由於'a1','a2'屬於'a'類別,因此a1,a2的數據應該接替'a'類別的數據,並且b1,b2的數據應該接替'b'類別的數據等等。 – chemicalkt

+0

@chemicalkt - 您保證數據將按照您的樣本數據的字母順序排序嗎?如果不是,如何知道是先返回'a'行還是先返回'b'行? –

+0

a或b行可以按任意順序返回,但a1,a2應在a和b1之後返回,b2應在b之後返回。 – chemicalkt