如何在Crystal Reports中不按分组排序使用聚合函数?
报表设置:按非聚合字段全局排序,同时保留聚合计算
需求说明
需要基于Order Num计算Qty的合计值(Total Qty),最终报表按Ref Num全局排序,而非强制将同一Order Num的行放在一起。无法修改数据库或需求,仅能调整报表设置。
输入数据
| Order Num | Ref Num | Qty |
|---|---|---|
| A | 1 | 1 |
| A | 3 | 1 |
| B | 2 | 3 |
| C | 4 | 1 |
| C | 0 | 4 |
期望输出
| Order Num | Ref Num | Qty | Total Qty |
|---|---|---|---|
| C | 0 | 4 | 5 |
| A | 1 | 1 | 2 |
| B | 2 | 3 | 3 |
| A | 3 | 1 | 2 |
| C | 4 | 1 | 5 |
当前困境
- 若按
Order Num分组,同一Order Num的行被强制聚合在一起,无法实现按Ref Num分散排序 - 若取消分组,则无法直接基于
Order Num计算合计值
解决方案
核心思路是通过报表的计算字段预计算每个Order Num的合计值,取消所有分组,直接按Ref Num排序,以下是主流报表工具的具体操作:
1. Crystal Reports
- 步骤1:创建聚合公式字段
打开公式编辑器,新建一个公式(命名为TotalQtyPerOrder),输入:
这个公式会自动计算当前行对应Sum({Table.Qty}, {Table.Order Num})Order Num的所有Qty之和。 - 步骤2:取消所有分组
进入「分组专家」,移除所有基于Order Num的分组设置。 - 步骤3:设置全局排序
进入「排序专家」,添加Ref Num作为唯一排序字段,选择升序/降序。 - 步骤4:配置报表布局
将Order Num、Ref Num、Qty和公式字段TotalQtyPerOrder拖到报表的「详细节」中,生成最终报表。
2. SQL Server Reporting Services (SSRS)
方法A:通过数据集查询预计算合计(推荐,性能更优)
在报表数据集的查询中添加子查询计算合计(无需修改数据库结构,仅调整报表查询):
SELECT o.[Order Num], o.[Ref Num], o.Qty, (SELECT SUM(Qty) FROM YourTableName WHERE [Order Num] = o.[Order Num]) AS [Total Qty] FROM YourTableName o ORDER BY o.[Ref Num]
然后直接将字段拖到表格中,无需分组即可按Ref Num排序并显示合计。
方法B:通过报表计算字段实现
- 打开报表的「字段」面板,右键点击数据集,选择「添加计算字段」。
- 命名为
Total Qty,输入表达式:=Sum(CInt(LookupSet(Fields!Order_Num.Value, Fields!Order_Num.Value, Fields!Qty.Value, "YourDataSetName"))) - 取消表格的所有分组设置,在「排序」选项中添加
Ref Num作为排序字段。 - 将所有字段(包括计算字段
Total Qty)添加到表格行中。
内容的提问来源于stack exchange,提问作者Brandon Fedie
相关产品推荐
相关产品推荐

