Epicor BAQ高级汇总
原始数据
| Country | CustID | Amount |
|---|---|---|
| US | C001 | 100 |
| US | C002 | 200 |
| CN | C003 | 150 |
ROLLUP(Customer.Country, Customer.CustID)
ROLLUP(Customer.Country, Customer.CustID) 是一种分组汇总扩展,用于生成多层级汇总数据,相当于自动帮你做“小计 + 总计”。
可以把它理解为:
👉 在普通 GROUP BY 的基础上,增加分组层级的汇总行
SQL 全选
GROUP BY ROLLUP(Customer.Country, Customer.CustID)等价于下面这几种分组的组合:
Markup 全选
GROUP BY
(
Customer.Country, Customer.CustID -- 明细
),
(
Customer.Country -- 国家小计
),
(
() -- 总计
)结果:
| Country | CustID | Amount |
|---|---|---|
| US | C001 | 100 |
| US | C002 | 200 |
| US | NULL | 300 |
| CN | C003 | 150 |
| CN | NULL | 150 |
| NULL | NULL | 450 |
1️⃣ NULL 的含义
- CustID = NULL → 表示该国家的小计
- Country = NULL AND CustID = NULL → 表示总计
⚠️ 不是数据真的为 NULL,是“汇总行标记”
GROUPING SETS(Customer.Country, Customer.CustID)
👉 只做这两种分组(而且是独立的)
Markup 全选
(Customer.Country)
(Customer.CustID)⚠️ 注意:
没有明细、没有层级关系、没有总计
等价于下面这种写法:
SQL 全选
GROUP BY GROUPING SETS (
(Customer.Country),
(Customer.CustID)
)结果:
| Country | CustID | Amount |
|---|---|---|
| US | NULL | 300 |
| CN | NULL | 150 |
| NULL | C001 | 100 |
| NULL | C002 | 200 |
| NULL | C003 | 150 |
👉 特点:
- ✔ 按国家汇总
- ✔ 按客户汇总
- ❌ 没有明细(Country + CustID)
- ❌ 没有总计
- ❌ 没有层级关系
CUBE(Customer.Country, Customer.CustID)
好,这个就到“三件套”里最后一个了:CUBE 👇
它比 ROLLUP 和 GROUPING SETS 都更“猛”。
对所有维度做“全组合汇总”(所有可能分组都会算一遍)
SQL 全选
CUBE(A, B)等价于:
Markup 全选
GROUPING SETS (
(A, B), -- 明细
(A), -- 按A汇总
(B), -- 按B汇总
() -- 总计
)结果:
| Country | CustID | Amount |
|---|---|---|
| US | C001 | 100 |
| US | C002 | 200 |
| CN | C003 | 150 |
| US | NULL | 300 |
| CN | NULL | 150 |
| NULL | C001 | 100 |
| NULL | C002 | 200 |
| NULL | C003 | 150 |
| NULL | NULL | 450 |
👉 CUBE = 所有组合
如果有 N 个字段:
SQL 全选
CUBE(A, B, C)会生成
SQL 全选
(A,B,C)
(A,B)
(A,C)
(B,C)
(A)
(B)
(C)
()总数是:2^N 个分组
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
epicor 张国生


