您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

ORACLE分组统计

2025/1/13 19:05:23发布29次查看
欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入 rollup和cube语句。 oracle的group by语句除了最基本的语法外,还支持rollup和cube语句。如果是rollup(a, b, c)的话,首先会对(a、b、c)进行group by,然后对(a、b)进行group by,然后是(a)
欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入
    rollup和cube语句。
    oracle的group
    by语句除了最基本的语法外,还支持rollup和cube语句。如果是rollup(a, b, c)的话,首先会对(a、b、c)进行group
    by,然后对(a、b)进行group by,然后是(a)进行group by,最后对全表进行group by操作。如果是group by
    cube(a, b, c),则首先会对(a、b、c)进行group
    by,然后依次是(a、b),(a、c),(a),(b、c),(b),(c),最后对全表进行group by操作。
    grouping_id()可以美化效果:
    oracle的group by语句除了最基本的语法外,还支持rollup和cube语句。
    除本文内容外,你还可参考:
    分析函数参考手册:
    http://xsb.itpub.net/post/419/33028
    分析函数使用例子介绍:
    http://xsb.itpub.net/post/419/44634
    sql> create table t as select * from dba_indexes;
    表已创建。
    sql> select index_type, status, count(*) from t group by index_type, status;
    index_type status count(*)
    --------------------------- -------- ----------
    lob valid 51
    normal n/a 25
    normal valid 479
    cluster valid 11
    下面来看看rollup和cube语句的执行结果。
    sql> select index_type, status, count(*) from t group by rollup(index_type, status);
    index_type status count(*)
    --------------------------- -------- ----------
    lob valid 51
    lob 51
    normal n/a 25
    normal valid 479
    normal 504
    cluster valid 11
    cluster 11
    566
    已选择8行。
    sql> select index_type, status, count(*) from t group by cube(index_type, status);
    index_type status count(*)
    --------------------------- -------- ----------
    566
    n/a 25
    valid 541
    lob 51
    lob valid 51
    normal 504
    normal n/a 25
    normal valid 479
    cluster 11
    cluster valid 11
    已选择10行。
    查询结果不是很一目了然,下面通过oracle提供的函数grouping来整理一下查询结果。
    sql> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*)
    2 from t group by rollup(index_type, status) order by 1, 2;
    g_ind g_st index_type status count(*)
    ---------- ---------- --------------------------- -------- ----------
    0 0 lob valid 51
    0 0 normal n/a 25
    0 0 normal valid 479
    0 0 cluster valid 11
    0 1 lob 51
    0 1 normal 504
    0 1 cluster 11
    1 1 566
    已选择8行。
    这个查询结果就直观多了,和不带rollup语句的group by相比,rollup增加了对index_type的group by统计和对所有记录的group by统计。
    也就是说,如果是rollup(a, b, c)的话,首先会对(a、b、c)进行group by,然后对(a、b)进行group by,然后是(a)进行group by,最后对全表进行group by操作。
    下面看看cube语句。
    sql> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*)
    2 from t group by cube(index_type, status) order by 1, 2;
    g_ind g_st index_type status count(*)
    ---------- ---------- --------------------------- -------- ----------
    0 0 lob valid 51
    0 0 normal n/a 25
    0 0 normal valid 479
    0 0 cluster valid 11
    0 1 lob 51
    0 1 normal 504
    0 1 cluster 11
    1 0 n/a 25
    1 0 valid 541
    1 1 566
    已选择10行。
    和rollup相比,cube又增加了对status列的group by统计。
    如果是group by cube(a, b, c),则首先会对(a、b、c)进行group by,然后依次是(a、b),(a、c),(a),(b、c),(b),(c),最后对全表进行group by操作。
    除了使用grouping函数,还可以使用grouping_id来标识group by结果。
    sql> select grouping_id(index_type, status) g_ind, index_type, status, count(*)
    2 from t group by rollup(index_type, status) order by 1;
    g_ind index_type status count(*)
    ---------- --------------------------- -------- ----------
    0 lob valid 51
    0 normal n/a 25
    0 normal valid 479
    0 cluster valid 11
    1 lob 51
    1 normal 504
    1 cluster 11
    3 566
    已选择8行。
    sql> select grouping_id(index_type, status) g_ind, index_type, status, count(*)
    2 from t group by cube(index_type, status) order by 1;
    g_ind index_type status count(*)
    ---------- --------------------------- -------- ----------
    0 lob valid 51
    0 normal n/a 25
    0 normal valid 479
    0 cluster valid 11
    1 lob 51
    1 normal 504
    1 cluster 11
    2 n/a 25
    2 valid 541
    3 566
    已选择10行。
    grouping_id()可以美化效果:
    select decode(grouping_id(c1), 1, '合计', c1) d1,
    decode(grouping_id(c1, c2), 1, '小计', c2) d2,
    decode(grouping_id(c1, c2, c1 + c2), 1, '小计', c1 + c2) d3,
    count(*),
    grouping_id(c1, c2, c1 + c2, c1 + 1, c2 + 1),
    grouping_id(c1)
    from t2
    group by rollup(c1, c2, c1 + c2, c1 + 1, c2 + 1);
    ===========================================================
    1.
    报表合计专用的
    rollup
    函数
    销售报表
    以往的查询
    sql:
    select
    area,month,sum(money) from saleorder group by area,month
[1] [2] [3]
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product