oracle中group by的高級用法

簡單的group by用法
select c1,sum(c2)
from t1
where t1<>'test'
group by c1
having sum(c2)>100;函數

rollup(多列)——上卷彙總,從最後一個彙總字段開始上卷彙總,一直到合計
select c1,c2,sum(c3)
from t1
group by rollup(c1,c2)
含義:
c1,c2分組合計
c1分組合計
總計code

cube(多列)——組合彙總,以彙總字段的子集做爲彙總條件彙總,包括合計
select c1,c2,sum(c3)
from t1
group by cube(c1,c2)
含義:
c1,c2分組合計
c1分組合計
c2分組合計
總計test

grouping(單列名)只用於rollup和cube,單列名是rollup和cube中的一個列名,表示此記錄的分組條件是否包含此列,1表示否,0表示是。
select decode(grouping(c1),1,'all c1',c1) as first,
decode(grouping(c2),1,'all c2',c2) as second,sum(c3)
from t1
group by cube(c1,c2)
含義:
使記錄含義更清晰,而不是單純的一個null值。擴展

grouping sets(多列)——分列彙總,按參數中的各列分別彙總。
select c1,c2,sum(c3)
from t1
group by grouping sets(c1,c2)
含義:
按c1和c2的分別做爲group by的條件

grouping_id(多列)
是grouping()的擴展,至關於grouping_id(c1,c2)=(grouping(c1)||grouping(c2)表示的二進制)的值
能夠表示分組的層級select

group by語句能夠同時使用普通列、rollup()和cube()等做爲條件,若是一個列在不一樣地方出現了屢次,結果集能夠會重複。同時使用的含義是:普通列加上高級函數的每一個結果做爲group by的條件彙總,rollup

group_id()函數,無參數,能夠表示此分組記錄是否重複,0表示第一次,1表示重複。二進制

最後:rollup,cube,grouping sets的參數能夠將多個列名用「()」做爲一個處理單元。例如rollup(c1,(c2,c3),c4),c2,c3不會被分拆,也就不會出現至關於group by c1,c2的結果集。
ping

相關文章
相關標籤/搜索