4.postgresql--rollup,grouping sets,cube

PostgreSQL ROLLUP 是group by 的子句,是生成多个分组集合的快捷功能。与Cube子句的差异是,rollup 不生成基于特定列所有可能的分组集合,生成分组集合为其子集。

ROLLUP假设输入列之间存在层次结构,从而生成有意义的所有分组集合。这就是为什么ROLLUP经常用于生成报表的小计和总计。

cube (c1,c2,c3)生成所有8中可能:

(c1, c2, c3)
(c1, c2)
(c2, c3)
(c1,c3)
(c1)
(c2)
(c3)
()

而ROLLUP(c1,c2,c3)仅生成4种分组集合,假设层级c1 > c2 > c3:

(c1, c2, c3)
(c1, c2)
(c1)
()

CREATE TABLE geeksforgeeks_courses(
    course_name VARCHAR NOT NULL,
    segment VARCHAR NOT NULL,
    quantity INT NOT NULL,
    PRIMARY KEY (course_name, segment)
);

INSERT INTO geeksforgeeks_courses(course_name, segment, quantity)
VALUES
    ('Data Structure in Python', 'Premium', 100),
    ('Algorithm Design in Python', 'Basic', 200),
    ('Data Structure in Java', 'Premium', 100),
    ('Algorithm Design in Java', 'Basic', 300);
   select  course_name,
    segment,
    SUM (quantity)
    from  geeksforgeeks_courses
    group by (course_name, segment) order by course_name,segment

在这里插入图片描述

 select  course_name,
    segment,
    SUM (quantity)
    from  geeksforgeeks_courses
    group by (course_name, segment) 
    union all 
    select  course_name,
    NULL,
    SUM (quantity)
    from  geeksforgeeks_courses
    group by (course_name) 
    
    union all 
     select  NULL,
    NULL,
    SUM (quantity)
    from  geeksforgeeks_courses
    order by course_name,segment
    

在这里插入图片描述
用如下的sql可以达到相同的效果

SELECT
    course_name,
    segment,
    SUM (quantity)
FROM
    geeksforgeeks_courses
GROUP BY
    ROLLUP (course_name, segment)
ORDER BY
    course_name,
    segment;
SELECT
    coalesce(course_name,'所有课程'),
    coalesce(segment,'所有'),
    SUM (quantity)
FROM
    geeksforgeeks_courses
GROUP BY
    ROLLUP (course_name, segment)
ORDER BY
    course_name,
    segment;

在这里插入图片描述

SELECT
    coalesce(course_name,'所有课程'),
    coalesce(segment,'所有'),
    SUM (quantity)
FROM
    geeksforgeeks_courses
GROUP BY
    cube (course_name, segment)

在这里插入图片描述

cube 分成了(), course_name,segment,course_name+segment
而rollup分成了(),course_name,course_name+segment

按照自定义进行分组

SELECT
    coalesce(course_name,'所有课程'),
    coalesce(segment,'所有'),
    SUM (quantity)
FROM
    geeksforgeeks_courses
GROUP by GROUPING SETS ((course_name),(segment),(course_name,segment),())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值