新特性解读 | GROUPING() 函数用法解析

MySQL高级函数之:`GROUPING()`:其在`WITH ROLLUP`中区分汇总行和明细行。 GROUPING() 阅读详情

作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


MySQL 8.0 新增了 GROUPING() 函数,用来理清 GROUP BY with rollup 子句检索后所产生的每个分组汇总结果。
grouping 可用在分组列,having 子句以及 order by 子句。在了解 grouping 函数如何使用之前,先来看看简单 group by with rollup 的检索是何种情形。

GROUP BY WITH ROLLUP

GROUP BY 子句 ROLLUP 可以为 GROUP BY 运行结果的每一个分组返回一个统计行,并且为所有分组返回一个总的统计行。
此文中所用的示例表 y1 结构:

mysql> show create table y1\G
*************************** 1. row ***************************
       Table: y1
Create Table: CREATE TABLE `y1` (
  `id` int NOT NULL,
  `r1` int DEFAULT NULL,
  `r2` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

按照字段 r1 r2 来正常检索,GROUP BY 的统计结果:

mysql> SELECT r1, r2, COUNT(*)
    -> FROM y1
    -> GROUP BY r1, r2;
+------+------+----------+
| r1   | r2   | count(*) |
+------+------+----------+
|    1 |    2 |        2 |
|    2 |    5 |        2 |
|    1 |    4 |        1 |
|    4 |    3 |        4 |
|    2 |    2 |        3 |
|    4 |    4 |        2 |
|    5 |    5 |        1 |
|    4 |    5 |        1 |
|    3 |    1 |        1 |
|    5 |    2 |        1 |
|    4 |    2 |        1 |
|    3 |    2 |        1 |
+------+------+----------+
12 rows in set (0.00 sec)

当此条统计 SQL 加上 ROLLUP 子句后,会在每个分组后面加上一行统计值,其中统计行高位字段显示为 NULL,COUNT 结果用来计算分组内的总记录数。

mysql> SELECT r1, r2, COUNT(*)
    -> FROM y1
    -> GROUP BY r1, r2 WITH ROLLUP;
+------+------+----------+
| r1   | r2   | count(*) |
+------+------+----------+
|    1 |    2 |        2 |
|    1 |    4 |        1 |
|    1 | NULL |        3 |
|    2 |    2 |        3 |
|    2 |    5 |        2 |
|    2 | NULL |        5 |
|    3 |    1 |        1 |
|    3 |    2 |        1 |
|    3 | NULL |        2 |
|    4 |    2 |        1 |
|    4 |    3 |        4 |
|    4 |    4 |        2 |
|    4 |    5 |        1 |
|    4 | NULL |        8 |
|    5 |    2 |        1 |
|    5 |    5 |        1 |
|    5 | NULL |        2 |
| NULL | NULL |       20 |
+------+------+----------+
18 rows in set (0.00 sec)

那表 y1 没有记录存储为 NULL,都是非 NULL 值,现在为表 y1 插入几条包含 NULL 的记录。

mysql> insert into y1 values (21,null,null);
Query OK, 1 row affected (0.01 sec)

mysql> insert into y1 values (22,1,null);
Query OK, 1 row affected (0.01 sec)

mysql> insert into y1 values (23,2,null);
Query OK, 1 row affected (0.01 sec)

mysql> insert into y1 values (24,3,null);
Query OK, 1 row affected (0.01 sec)

mysql> insert into y1 values (25,4,null);
Query OK, 1 row affected (0.01 sec)

mysql> insert into y1 values (26,5,null);
Query OK, 1 row affected (0.01 sec)

此时再来看看 WITH ROLLUP 统计的结果。

mysql> SELECT r1, r2, COUNT(*)
    -> FROM y1
    -> GROUP BY r1, r2 WITH ROLLUP;

+------+------+----------+
| r1   | r2   | count(*) |
+------+------+----------+
| NULL | NULL |        1 |
| NULL | NULL |        1 |
|    1 | NULL |        1 |
|    1 |    2 |        2 |
|    1 |    4 |        1 |
|    1 | NULL |        4 |
|    2 | NULL |        1 |
|    2 |    2 |        3 |
|    2 |    5 |        2 |
|    2 | NULL |        6 |
|    3 | NULL |        1 |
|    3 |    1 |        1 |
|    3 |    2 |        1 |
|    3 | NULL |        3 |
|    4 | NULL |        1 |
|    4 |    2 |        1 |
|    4 |    3 |        4 |
|    4 |    4 |        2 |
|    4 |    5 |        1 |
|    4 | NULL |        9 |
|    5 | NULL |        1 |
|    5 |    2 |        1 |
|    5 |    5 |        1 |
|    5 | NULL |        3 |
| NULL | NULL |       26 |
+------+------+----------+
25 rows in set (0.00 sec)

由于表 y1 本身包含了一系列包含 NULL 的记录,这条 SQL 有点分不清哪些是正常的 NULL,哪些是汇总的 NULL。

接下来 GROUPING() 函数准备上场……

GROUPING() 函数

GROUPING() 函数用来返回每个分组是否为 ROLLUP 结果,是为 1 否为 0。从结果中,很容易就能区分哪些 NULL 是正常记录,哪些是 ROLLUP 的结果。

mysql> SELECT r1
    -> , if(GROUPING(r1) = 1, '汇总', '正常记录') AS grouping_r1
    -> , r2
    -> , if(GROUPING(r2) = 1, '汇总', '正常记录') AS grouping_r2
    -> , COUNT(*)
    -> FROM y1
    -> GROUP BY r1, r2 WITH ROLLUP;

+------+--------------+------+--------------+----------+
| r1   | grouping_r1  | r2   | grouping_r2  | count(*) |
+------+--------------+------+--------------+----------+
| NULL | 正常记录     | NULL | 正常记录     |        1 |
| NULL | 正常记录     | NULL | 汇总         |        1 |
|    1 | 正常记录     | NULL | 正常记录     |        1 |
|    1 | 正常记录     |    2 | 正常记录     |        2 |
|    1 | 正常记录     |    4 | 正常记录     |        1 |
|    1 | 正常记录     | NULL | 汇总         |        4 |
|    2 | 正常记录     | NULL | 正常记录     |        1 |
|    2 | 正常记录     |    2 | 正常记录     |        3 |
|    2 | 正常记录     |    5 | 正常记录     |        2 |
|    2 | 正常记录     | NULL | 汇总         |        6 |
|    3 | 正常记录     | NULL | 正常记录     |        1 |
|    3 | 正常记录     |    1 | 正常记录     |        1 |
|    3 | 正常记录     |    2 | 正常记录     |        1 |
|    3 | 正常记录     | NULL | 汇总         |        3 |
|    4 | 正常记录     | NULL | 正常记录     |        1 |
|    4 | 正常记录     |    2 | 正常记录     |        1 |
|    4 | 正常记录     |    3 | 正常记录     |        4 |
|    4 | 正常记录     |    4 | 正常记录     |        2 |
|    4 | 正常记录     |    5 | 正常记录     |        1 |
|    4 | 正常记录     | NULL | 汇总         |        9 |
|    5 | 正常记录     | NULL | 正常记录     |        1 |
|    5 | 正常记录     |    2 | 正常记录     |        1 |
|    5 | 正常记录     |    5 | 正常记录     |        1 |
|    5 | 正常记录     | NULL | 汇总         |        3 |
| NULL | 汇总         | NULL | 汇总         |       26 |
+------+--------------+------+--------------+----------+
25 rows in set (0.00 sec)

GROUPING() 函数不仅仅是针对单个字段来统计汇总值,还可以针对多个字段。把上面的 SQL 修改下,变为:

mysql> SELECT r1, r2, GROUPING(r1, r2) AS grouping_r1_r2
    -> , COUNT(*)
    -> FROM y1
    -> GROUP BY r1, r2 WITH ROLLUP;
+------+------+----------------+----------+
| r1   | r2   | grouping_r1_r2 | COUNT(*) |
+------+------+----------------+----------+
| NULL | NULL |              0 |        1 |
| NULL | NULL |              1 |        1 |
|    1 | NULL |              0 |        1 |
|    1 |    2 |              0 |        2 |
|    1 |    4 |              0 |        1 |
|    1 | NULL |              1 |        4 |
|    2 | NULL |              0 |        1 |
|    2 |    2 |              0 |        3 |
|    2 |    5 |              0 |        2 |
|    2 | NULL |              1 |        6 |
|    3 | NULL |              0 |        1 |
|    3 |    1 |              0 |        1 |
|    3 |    2 |              0 |        1 |
|    3 | NULL |              1 |        3 |
|    4 | NULL |              0 |        1 |
|    4 |    2 |              0 |        1 |
|    4 |    3 |              0 |        4 |
|    4 |    4 |              0 |        2 |
|    4 |    5 |              0 |        1 |
|    4 | NULL |              1 |        9 |
|    5 | NULL |              0 |        1 |
|    5 |    2 |              0 |        1 |
|    5 |    5 |              0 |        1 |
|    5 | NULL |              1 |        3 |
| NULL | NULL |              3 |       26 |
+------+------+----------------+----------+
25 rows in set (0.00 sec)

此时会发现,GROUPING() 函数对多个字段结果并非只有 1 和 0,还有一个值为 3。在 GROUPING() 函数包含多个参数时,按照以下方式来返回结果:

  • GROUPING(r1,r2) 等价于 GROUPING(r2) + GROUPING(r1) << 1
  • GROUPING(r1,r2,r3,…) 等价于 GROUPING(r3) + GROUPING(r2) << 1 + - GROUPING(r1) << 2
  • 以此类推

再次来改下以上 SQL,用 (GROUPING(r2) + (GROUPING(r1) << 1)) 来替换 GROUPING(r1,r2)

mysql> SELECT r1, r2,(grouping(r2) + (grouping(r1) << 1)) grouping_r1_r2, count(*) FROM y1 GROUP BY r
1, r2 WITH ROLLUP;
+------+------+----------------+----------+
| r1   | r2   | grouping_r1_r2 | count(*) |
+------+------+----------------+----------+
| NULL | NULL |              0 |        1 |
| NULL | NULL |              1 |        1 |
|    1 | NULL |              0 |        1 |
|    1 |    2 |              0 |        2 |
|    1 |    4 |              0 |        1 |
|    1 | NULL |              1 |        4 |
|    2 | NULL |              0 |        1 |
|    2 |    2 |              0 |        3 |
|    2 |    5 |              0 |        2 |
|    2 | NULL |              1 |        6 |
|    3 | NULL |              0 |        1 |
|    3 |    1 |              0 |        1 |
|    3 |    2 |              0 |        1 |
|    3 | NULL |              1 |        3 |
|    4 | NULL |              0 |        1 |
|    4 |    2 |              0 |        1 |
|    4 |    3 |              0 |        4 |
|    4 |    4 |              0 |        2 |
|    4 |    5 |              0 |        1 |
|    4 | NULL |              1 |        9 |
|    5 | NULL |              0 |        1 |
|    5 |    2 |              0 |        1 |
|    5 |    5 |              0 |        1 |
|    5 | NULL |              1 |        3 |
| NULL | NULL |              3 |       26 |
+------+------+----------------+----------+
25 rows in set (0.00 sec)

这里和直接 GROUPING(r1, r2) 的结果一致。
GROUPING 语句还可以用在 HAVING 子句里,比如用 GROUPING 子句来过滤掉非 ROLLUP 的结果。

mysql> SELECT r1, r2,count(*) FROM y1 GROUP BY r1, r2 WITH ROLLUP having grouping(r1) = 1 or grouping(r2) = 1;
+------+------+----------+
| r1   | r2   | count(*) |
+------+------+----------+
| NULL | NULL |        1 |
|    1 | NULL |        4 |
|    2 | NULL |        6 |
|    3 | NULL |        3 |
|    4 | NULL |        9 |
|    5 | NULL |        3 |
| NULL | NULL |       26 |
+------+------+----------+
7 rows in set (0.00 sec)

总结

这里介绍了 MySQL 8.0 的新函数 GROUPING()的用法,如有不足欢迎批评指正。

多维聚合实战:GROUPING SETS、窗口函数与稀疏性处理 多维聚合是BI报表、指标体系和机器学习特征工程的核心数据操作,其本质是在多个维度交叉下对原始数据进行语义保持的汇总计算。传统GROUP BY在面对维度稀疏性、层级关系和动态基准需求时极易失效,导致空值误判、同比失真与TOP N逻辑崩溃。现代解决方案依赖GROUPING SETS实现一次扫描多维组合,结合窗口函数完成聚合后计算(如占比、滚动均值),并通过GENERATE_SERIES或维度补全策略应对隐式缺失问题。技术价值在于保障‘数字可解释’——每个NULL都需明确区分是数据缺失、分组折叠还是计算空集。典型 阅读详情

相关推荐

多维聚合实战:ROLLUP、CUBE与GROUPING SETS原理与优化

多维聚合是OLAP分析与BI报表的核心能力,本质是将高维业务数据在立方体空间中进行结构化切片与汇总。其底层依赖数据库对维度组合的动态上下文管理,通过ROLLUP实现层次折叠、CUBE生成全量组合、GROUPING SETS精准控制输出,三者均围绕空值语义、聚合上下文切换和执行计划优化展开。技术价值在于以单次扫描替代多次GROUP BY,显著提升宽表构建、钻取分析与实时汇总效率;典型应用场景包括零售销售多维下钻、金融风险跨维度归因、物流时效交叉分析等。本文聚焦SQL标准多维聚合语法的本质机制与生产级调优,深入

weixin_30838873的博客 437

GROUPING函数

GROUPING函数            GROUPING函数既可以与CUBE操作一起使用, 也可以与ROLLUP操作一起使用, 它能帮助你理解概要值是怎样产生的。            GROUPING函数使用一个单独的列表示。在GROUPING函数中的expr必须匹配一个GROUP BY子句中的表达式, 该函数的返回值0或1。            GROUPING函数的返回值用于:

u013053796的专栏 1万+

混合开关电容DCDC变换器技术解析与工程应用指南

在电源设计领域,传统DCDC变换器在高降压比或高升压比场景下,往往面临占空比过窄、开关应力大、效率偏低等瓶颈。开关电容变换器虽能实现固定比例的电压变换,却受限于调节能力。混合开关电容DCDC变换器通过“开关电容网络粗调变比+电感式DCDC细调输出”的策略,兼顾高效率、高功率密度与宽调压范围。本文梳理了其典型拓扑(如2:1/4:1 SC+Buck)、关键对比、控制策略(含软充电)及工程应用中的常见问题,帮助电源工程师在服务器供电、快充、车载电源等场景下快速选型与调试。

weixin_29164185的博客 311

oracle 分析函数、GROUPING函数

分析函数 over(Partition by...) 一个超级牛皮的ORACLE特有函数。 天天都用ORACLE,用了快2年了。最近才接触到这个功能强大而灵活的函数。真实惭愧啊! oracle的分析函数over 及开窗函数 一:分析函数over Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每...

Leon_Jinhai_Sun的博客 1272

从零复刻平衡小车(基于STM32F1)

平衡小车(基于STM32F1)

Legendyyy的博客 5039

基于ResNet-50的猫狗分类训练

基于ResNet-50的猫狗分类python训练

weixin_46352497的博客 1004

Oracle——分组汇总统计函数grouping()

Oracle——分组汇总统计函数grouping() 在Oracle数据库中,进行分组报表查询的时候,查询的SQL中可以使用grouping()函数。 grouping(columnA)函数的意思:当前行如果是由rollup汇总产生的,那么columnA这个字段值为1否则为0; 元数据: 通过grouping查询后的数据: 查询的SQL: SELECT DECODE...

命中的缘分的博客 6454

深入了解AES_GCM算法

常见的对称加密算法,在解密过程中无法确认密钥是否正确的。这就意味着,密文可以用任何密钥执行解密运算,得到一组疑似密文;由于不知道密钥是否正确,故也不能确定解密出来的明文数据是否正确。因此,需要在对称加密算法上增加一层验证机制,常见思路为使用加密算法进行加密保证机密性,使用摘要算法计算MAC保证完整性和真实性,这就涉及到摘要计算和加密计算的前后顺序和参与计算的数据、密钥等,使用起来略微麻烦。

huaqianzkh的专栏 4186

选择排序

算法描述:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个时为止。 public class SortSelect { public static void main(String[] args){ //定义一个数组 int...

weixin_42981168的博客 460

CCF CSP历年题解(python)

菜鸡一枚,没参加过算法竞赛,单纯为了抵研究生考试复试才刷题,通过写博客记录下来,希望能和大家互相交流,代码质量不高,大家见谅。 因为考研等原因,题目不定期更新… 第一题 201312-1出现最多次数的数 ...

weixin_44690402的博客 5004

Dify沙箱权限配置实战:解决‘operation not permitted‘报错的完整指南

本文详细解析了Dify平台中常见的'operation not permitted'报错根源,即沙箱安全机制对系统调用的限制。通过实战步骤,指导用户定位并修改config.yaml配置文件,精准配置allowed_syscalls白名单以解决权限问题,涵盖从文件操作、进程控制到网络通信等关键系统调用的编号详解与配置示例,帮助用户在保障安全的前提下,顺利运行依赖特定库的代码工作流。

tech5的博客 1202

ORACLE GROUPING函数的使用

GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。 关于ROLLUP和CUBE函数的使用,请参见我的另一篇文章。http://blog.youkuaiyun.com/wh62592855/archiv

朝着梦想 渐行前进 4万+

6、核函数与再生核希尔伯特空间:原理、应用与实践

本文系统介绍了核函数与再生核希尔伯特空间(RKHS)的理论基础、核心性质及其在机器学习和信号处理中的广泛应用。文章从核方法的优势出发,阐述了其在非线性建模、正则化和算法核化方面的独特价值,并深入探讨了正定核、Mercer定理、表示定理等关键理论。通过构建多种标准核与工程专用核,展示了核函数的设计灵活性。结合支持向量回归(SVR)模型与多个MATLAB示例,详细说明了核方法的实际应用流程与操作技巧。最后,总结了核方法的应用领域、未来发展方向及学习实践建议,为读者提供了一套完整的理论与实践指南。

z2a3b4c5d的博客 143

grouping函数 mysql_新特性解读 | GROUPING() 函数用法解析

MySQL 8.0 新增了 GROUPING() 函数,用来理清 GROUP BY with rollup 子句检索后所产生的每个分组汇总结果。grouping 可用在分组列,having 子句以及 order by 子句。在了解 grouping 函数如何使用之前,先来看看简单 group by with rollup 的检索是何种情形。GROUP BY WITH ROLLUPGROUP BY ...

weixin_42713608的博客 840

Open3D 基于法线的双边滤波

基于法线的双边滤波是一种用于点云平滑的技术,它结合了点与其邻域点之间的几何距离和法线方向的相似性,从而在去除噪声的同时保留几何特征。这种滤波方法广泛应用于点云处理领域,尤其是在需要保留表面细节和边缘的场景中。

纵马踏花向自由 2499

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入解析 Oracle 的聚合函数 ROLLUP

在数据库的日常使用中,数据的统计与分析是至关重要的环节,而聚合函数则是实现这些操作的得力工具,其中 ROLLUP 函数更是以其独特的功能,为复杂的数据汇总需求提供了高效的解决方案。

renkejia1988的博客 3218

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

避坑指南:Hive中GROUPING__ID和ROLLUP的5个常见错误用法

本文深入解析Hive中GROUPING__ID和ROLLUP的五大常见错误用法,包括二进制位运算误区、维度顺序影响、空值处理陷阱、GROUPING SETS映射错误及性能优化策略。通过实战案例和解决方案,帮助开发者避免分析结果错误,提升多维分析效率。特别关注GROUPING__ID的二进制掩码解析和ROLLUP的正确使用顺序。

desk3的博客 818

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

多维聚合实战:超越GROUP BY的ROLLUP/CUBE/GROUPING SETS深度解析

多维聚合是数据分析与数仓建设的核心能力,其本质是通过结构化分组实现指标的灵活上卷、下钻与跨层级一致性计算。传统GROUP BY仅支持静态切片,缺乏对NULL语义、层级关系和业务口径的显式建模能力;而ROLLUP、CUBE及标准SQL 2016规范的GROUPING SETS,提供了可声明、可审计、可校验的语义化聚合机制。结合GROUPING()与GROUPING_ID()函数,能精准识别汇总占位符、隔离原始空值、支撑自动化口径校验与前端钻取服务。该技术广泛应用于BI报表开发、指标平台构建及实时宽表生成等场景

weixin_34379433的博客 299

PostgreSQL 源码解读(73)- 查询语句#58(grouping_planner函数...

先前花了二十多个小节介绍query_planner及其子函数make_one_rel,已基本介绍完毕。本节回过头来Review query_planner函数的调用方-查询优化实现中的grouping_...

433

多维聚合实战:从CUBE、ROLLUP到GROUPING SETS的工程决策

多维聚合是现代数据分析的核心能力,它超越基础SUM/COUNT,本质是通过维度建模表达业务逻辑。其技术原理围绕数据立方体构建,依赖GROUPING SETS、CUBE和ROLLUP等SQL高级语法实现灵活切片;关键价值在于避免传统GROUP BY导致的维度爆炸、NULL语义混淆与参照系错位,显著提升归因分析效率与指标可信度;典型应用场景包括BI报表下钻、运营漏斗归因、实时大屏监控及风控特征分析。本文聚焦真实工程落地中的语法选择逻辑、性能陷阱识别与语义一致性保障,尤其深入解析GROUPING()函数、GROU

weixin_33862993的博客 502

Svedit选择系统详解:3种选区与为什么原生DOM Selection是唯一事实来源

Svedit 是一个面向 Svelte 的结构化内容编辑框架,核心理念是"内容即编辑器"——你用 JSON 定义文档模型、用自定义 Svelte 组件渲染内容,就能直接在页面画布上编辑。而支撑这一切的,正是它的**选择系统(Selection System)**:统一管理文本、节点、属性这 3 种选区,并始终以浏览器的原生 DOM Selection 作为唯一事实来源。 ## 先认识 Svedi

gitblog_00019的博客 738

深入Spark源码:带你拆解Grouping Sets里那个神秘的‘Expand’算子

本文深入解析Spark SQL中Grouping Sets的Expand算子设计原理与实现机制。通过剖析数据扩展阶段和聚合优化策略,揭示Expand如何高效处理多维聚合查询,相比UNION ALL显著提升性能。文章包含实战优化建议和高级应用场景,帮助开发者掌握Spark SQL底层实现精髓。

weixin_30338481的博客 463
上一篇: 技术分享 | MySQL binlog 日志解析
下一篇: 故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值