Oracle-分組求和

  • 普通使用
with
    tmp_table
as(
    select '1001' group1, 'a' group2, 'Y' group3, 1 num from dual
    union all
    select '1001' group1, 'a' group2, 'N' group3, 2 num from dual
    union all
    select '1001' group1, 'a' group2, 'Y' group3, 3 num from dual
    union all
    select '1001' group1, 'b' group2, 'N' group3, 4 num from dual
    union all
    select '1001' group1, 'b' group2, 'Y' group3, 5 num from dual
    union all
    select '1002' group1, 'a' group2, 'N' group3, 6 num from dual
    union all
    select '1002' group1, 'a' group2, 'Y' group3, 7 num from dual
    union all
    select '1002' group1, 'b' group2, 'N' group3, 8 num from dual
    union all
    select '1002' group1, 'b' group2, 'Y' group3, 9 num from dual
)
select group1, group2, group3, sum(num) num
    from tmp_table
        group by group1, group2, group3
            order by group1, group2, group3

在这里插入图片描述

  • 進階使用
with
    tmp_table
as(
    select '1001' group1, 1 num from dual
    union all
    select '1001' group1, 2 num from dual
    union all
    select '1001' group1, 3 num from dual
    union all
    select '1001' group1, 4 num from dual
    union all
    select '1001' group1, 5 num from dual
    union all
    select '1002' group1, 6 num from dual
    union all
    select '1002' group1, 7 num from dual
    union all
    select '1002' group1, 8 num from dual
    union all
    select '1002' group1, 9 num from dual
)
select group1,  num, sum(num) over(partition by group1 order by group1) ttl_num
    from tmp_table
        order by group1

在这里插入图片描述

  • 進階使用
    累加
with
    tmp_table
as(
    select '1001' group1, 1 num from dual
    union all
    select '1001' group1, 2 num from dual
    union all
    select '1001' group1, 3 num from dual
    union all
    select '1001' group1, 4 num from dual
    union all
    select '1001' group1, 5 num from dual
    union all
    select '1002' group1, 6 num from dual
    union all
    select '1002' group1, 7 num from dual
    union all
    select '1002' group1, 8 num from dual
    union all
    select '1002' group1, 9 num from dual
)
select group1,  num, sum(num) over(partition by group1 order by group1 asc rows between unbounded preceding and current row) num
    from tmp_table
        order by group1

在这里插入图片描述

  • 進階使用 grouping sets
    每一層都會sum一下
with
    tmp_table
as(
    select '1001' group1, 'a' group2, 'Y' group3, 1 num from dual
    union all
    select '1001' group1, 'a' group2, 'N' group3, 2 num from dual
    union all
    select '1001' group1, 'a' group2, 'Y' group3, 3 num from dual
    union all
    select '1001' group1, 'b' group2, 'N' group3, 4 num from dual
    union all
    select '1001' group1, 'b' group2, 'Y' group3, 5 num from dual
    union all
    select '1002' group1, 'a' group2, 'N' group3, 6 num from dual
    union all
    select '1002' group1, 'a' group2, 'Y' group3, 7 num from dual
    union all
    select '1002' group1, 'b' group2, 'N' group3, 8 num from dual
    union all
    select '1002' group1, 'b' group2, 'Y' group3, 9 num from dual
)
select group1, group2, group3, sum(num) num
    from tmp_table
        group by grouping sets((group1, group2, group3), (group1, group2), (group1))
            order by group1, group2, group3

在这里插入图片描述

  • 進階使用 rollup
    grouping sets的基礎上,增加一個總的合計
with
    tmp_table
as(
    select '1001' group1, 'a' group2, 'Y' group3, 1 num from dual
    union all
    select '1001' group1, 'a' group2, 'N' group3, 2 num from dual
    union all
    select '1001' group1, 'a' group2, 'Y' group3, 3 num from dual
    union all
    select '1001' group1, 'b' group2, 'N' group3, 4 num from dual
    union all
    select '1001' group1, 'b' group2, 'Y' group3, 5 num from dual
    union all
    select '1002' group1, 'a' group2, 'N' group3, 6 num from dual
    union all
    select '1002' group1, 'a' group2, 'Y' group3, 7 num from dual
    union all
    select '1002' group1, 'b' group2, 'N' group3, 8 num from dual
    union all
    select '1002' group1, 'b' group2, 'Y' group3, 9 num from dual
)
select group1, group2, group3, sum(num) num
    from tmp_table
        group by rollup(group1, group2, group3)
            order by group1, group2, group3

在这里插入图片描述

  • 進階使用 cube
    所有層都會有一個合計
with
    tmp_table
as(
    select '1001' group1, 'a' group2, 'Y' group3, 1 num from dual
    union all
    select '1001' group1, 'a' group2, 'N' group3, 2 num from dual
    union all
    select '1001' group1, 'a' group2, 'Y' group3, 3 num from dual
    union all
    select '1001' group1, 'b' group2, 'N' group3, 4 num from dual
    union all
    select '1001' group1, 'b' group2, 'Y' group3, 5 num from dual
    union all
    select '1002' group1, 'a' group2, 'N' group3, 6 num from dual
    union all
    select '1002' group1, 'a' group2, 'Y' group3, 7 num from dual
    union all
    select '1002' group1, 'b' group2, 'N' group3, 8 num from dual
    union all
    select '1002' group1, 'b' group2, 'Y' group3, 9 num from dual
)
select group1, group2, group3, sum(num) num
    from tmp_table
        group by cube(group1, group2, group3)
            order by group1, group2, group3

在这里插入图片描述

  • grouping
with
    tmp_table
as(
    select '1001' group1, 'a' group2, 'Y' group3, 1 num from dual
    union all
    select '1001' group1, 'a' group2, 'N' group3, 2 num from dual
    union all
    select '1001' group1, 'a' group2, 'Y' group3, 3 num from dual
    union all
    select '1001' group1, 'b' group2, 'N' group3, 4 num from dual
    union all
    select '1001' group1, 'b' group2, 'Y' group3, 5 num from dual
    union all
    select '1002' group1, 'a' group2, 'N' group3, 6 num from dual
    union all
    select '1002' group1, 'a' group2, 'Y' group3, 7 num from dual
    union all
    select '1002' group1, 'b' group2, 'N' group3, 8 num from dual
    union all
    select '1002' group1, 'b' group2, 'Y' group3, 9 num from dual
)
select group1, group2, group3, sum(num) num, grouping(group1),  grouping(group2), grouping(group3)
    from tmp_table
        group by grouping sets((group1, group2, group3), (group1, group2), (group1))
            order by group1, group2, group3

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值