Crystal Reports:如何仅按客户最新Version分组展示并统计
Crystal报表实现按「版本号-客户名称」分组并仅显示客户最新版本记录的方案
完全可行,以下是具体实现步骤:
一、数据源层面过滤(推荐,性能更优)
直接通过Crystal的「命令(Command)」编写SQL,提前筛选出每个客户的最新版本记录,避免报表加载冗余数据:
- 新建报表时选择「使用命令」作为数据源,编写如下SQL(需替换实际关联字段名,比如
TICKET_ID、CUSTOMER_ID):
SELECT t.*, h.*, c.* FROM TICKET t JOIN HISTORY h ON t.TICKET_ID = h.TICKET_ID JOIN CUSTOMER c ON t.CUSTOMER_ID = c.CUSTOMER_ID JOIN ( -- 子查询:计算每个客户对应的最新版本数值(处理x.y格式的版本号) SELECT c.CUSTOMER_ID, MAX( CAST(SUBSTRING(h.Version, 1, CHARINDEX('.', h.Version)-1) AS INT)*100 + CAST(SUBSTRING(h.Version, CHARINDEX('.', h.Version)+1, LEN(h.Version)) AS INT) ) AS MaxVersionNum FROM TICKET t JOIN HISTORY h ON t.TICKET_ID = h.TICKET_ID JOIN CUSTOMER c ON t.CUSTOMER_ID = c.CUSTOMER_ID GROUP BY c.CUSTOMER_ID ) max_version ON c.CUSTOMER_ID = max_version.CUSTOMER_ID AND ( CAST(SUBSTRING(h.Version, 1, CHARINDEX('.', h.Version)-1) AS INT)*100 + CAST(SUBSTRING(h.Version, CHARINDEX('.', h.Version)+1, LEN(h.Version)) AS INT) ) = max_version.MaxVersionNum
- 执行命令后,数据源仅保留每个客户的最新版本关联记录。
二、报表分组配置
在报表设计界面添加分组层级:
- 第一组:选择
HISTORY.Version作为分组字段,实现按版本号一级分组 - 第二组:选择
CUSTOMER.客户名称作为分组字段,实现按客户名称二级分组
三、统计与显示设置
- 版本号分组的「组脚注」中,添加唯一客户数统计:插入汇总字段,选择
Count函数,基于CUSTOMER.CUSTOMER_ID并勾选「distinct」选项,即可统计该版本下的客户数量 - 客户名称分组的「组页眉」或「细节节」中,添加客户相关字段(如名称、ID等)展示客户名单
可选:报表内抑制旧版本记录(无需修改数据源)
如果无法使用Command,可通过报表公式实现:
- 按「客户名称」分组,同时将
HISTORY.Version设置为降序排序,确保每个客户的最新版本记录排在最前 - 创建一个共享变量公式
@SetLatestVersion,放在客户分组的「组页眉」中:
Shared StringVar latest_version; latest_version := {HISTORY.Version};
- 创建抑制公式
@SuppressOldVersions,应用到HISTORY相关的细节节或组节:
Shared StringVar latest_version; {HISTORY.Version} <> latest_version
该公式会自动隐藏当前客户的非最新版本记录,但注意需确保每个客户仅对应一条最新版本的关联记录,避免重复。
内容的提问来源于stack exchange,提问作者Matt Spiller
相关产品推荐
相关产品推荐

