PostgreSQL ROLLUP教程

PostgreSQL ROLLUP教程

本文介绍如何使用PostgreSQL ROLLUP生成多组集合。

概述

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)
()

rollup通常用于按年、月、日计算数值合计,因为日期有层次 年>月>日。
下面描述其语法:

SELECT
    c1,
    c2,
    c3,
    aggregate(c4)
FROM
    table_name
GROUP BY
    ROLLUP (c1, c2, c3);

也可以部分上卷,从而减少生成子集的数量:

SELECT
    c1,
    c2,
    c3,
    aggregate(c4)
FROM
    table_name
GROUP BY
    c1, 
    ROLLUP (c2, c3);

PostgreSQL ROLLUP示例

下面查询使用rollup子句查询销售产品数量,根据品牌及品牌分段进行分组聚集:

SELECT
    brand,
    segment,
    SUM (quantity)
FROM
    sales
GROUP BY
    ROLLUP (brand, segment)
ORDER BY
    brand,
    segment;

在这里插入图片描述
图1

从输出结果可以看到,三行显示ABC品牌的销售数量,接下来是XYZ产品的销售数量,最后一行显示所有品牌的所有分段的销售数量。本示例中的层次是品牌>分段。

如果你改变两者顺序,结果不同:

SELECT
    segment,
    brand,
    SUM (quantity)
FROM
    sales
GROUP BY
    ROLLUP (segment, brand)
ORDER BY
    segment,
    brand;

在这里插入图片描述
图2

这种情况,层次为分段>品牌。

下面语句执行部分上卷:

SELECT
    segment,
    brand,
    SUM (quantity)
FROM
    sales
GROUP BY
    segment,
    ROLLUP (brand)
ORDER BY
    segment,
    brand;

在这里插入图片描述
图3

下面我们看另一个表的上卷操作,示例表结构如下:
在这里插入图片描述
图4

下面语句查询每年、月、日的租借数量:

SELECT
    EXTRACT (YEAR FROM rental_date) y,
    EXTRACT (MONTH FROM rental_date) M,
    EXTRACT (DAY FROM rental_date) d,
    COUNT (rental_id)
FROM
    rental
GROUP BY
    ROLLUP (
        EXTRACT (YEAR FROM rental_date),
        EXTRACT (MONTH FROM rental_date),
        EXTRACT (DAY FROM rental_date)
    );

在这里插入图片描述
图5

总结

本文我们已经学习PostgreSQL ROLLUP分组子句,通过示例展示如何生成多组集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值