如何在BIRT Report中实现同一患者重复字段仅首行显示的报表?
BIRT报表实现同一患者字段首行显示、后续留空的步骤
前提说明
你已基于给定SQL构建了Data Cube并获取医疗数据,当前报表中同一患者的No(row_num)、Date(INVOICE_DATE)、Patient Id(EMPLOYEE_ID)等字段每行重复显示,以下是实现目标格式的具体操作步骤:
1. 为SQL添加患者分组内的行号标识
先修改原SQL,新增一个用于标记同一患者下首行/后续行的字段,确保能区分同一患者的第一条记录:
SELECT ROW_NUMBER() OVER() AS row_num, -- 新增:按患者唯一标识分区,生成组内行号 ROW_NUMBER() OVER(PARTITION BY v.EMPLOYEE_ID, v.PATIENTNAME_AR ORDER BY v.INVOICE_DATE) AS patient_row_num, v.INVOICE_DATE, v.EMPLOYEE_ID, v.PATIENTNAME_AR, v.USER_LABEl, v.OFFICE_ID, v.ITEM_NAME, v.ITEM_QTYSOLD FROM ( -- 原子查询内容保持不变 SELECT i.INVOICE_DATE, i.EMPLOYEE_ID, dc.PATIENTNAME_AR, us.USER_LABEl, dc.OFFICE_ID, ii.ITEM_NAME, ii.ITEM_QTYSOLD FROM ECLINIC_KNG.DOCTOR_CONSULT dc INNER JOIN ECLINIC_KNG.INVOICE i ON(dc.CONSULT_ID=i.INV_CONSULT_ID) INNER JOIN ECLINIC_KNG.INVOICE_ITEM ii on(i.INVOICE_ID=ii.ITEM_INVOICE_ID) INNER JOIN ECLINIC_KNG.USER_SETUP us ON(dc.DOCTORS_ID=us.USER_ID) WHERE (i.INVOICE_DATE BETWEEN ? AND ?) AND i.employee_id IN ( Select employee_id from ECLINIC_KNG.invoice WHERE employee_id <>'' AND length(ltrim(employee_id,' +-.0123456789')) = 0 AND length(EMPLOYEE_ID)<6 AND to_NUMBER(employee_id)< 50000 ) ORDER BY i.INVOICE_DATE ASC )AS v;
新增的patient_row_num会给同一患者的第一条记录标记为1,后续记录依次递增。
2. 在报表设计中设置字段显示规则
打开BIRT报表设计器,找到用于展示数据的组件(数据透视表/列表),对需要首行显示的字段做如下设置:
- 选中目标字段对应的单元格(比如
row_num、INVOICE_DATE、EMPLOYEE_ID的单元格) - 右键选择编辑表达式,输入以下逻辑(替换为对应字段名):
if (row["patient_row_num"] == 1) { return row["INVOICE_DATE"]; // 替换为当前编辑的字段名,比如row["EMPLOYEE_ID"] } else { return ""; } - 也可以通过属性面板的「可见性」设置:选择「基于表达式」,输入
row["patient_row_num"] != 1,但这种方式会隐藏单元格,可能导致布局错位,更推荐返回空字符串的方式。
3. 调整Data Cube的分组与排序规则
如果使用数据透视表展示:
- 进入Data Cube编辑器,在「维度」中添加患者唯一标识(比如
EMPLOYEE_ID)作为分组维度,将其拖到透视表的「行」区域 - 确保透视表的排序规则为:先按患者标识排序,再按
INVOICE_DATE排序,保证同一患者的记录集中显示 - 对需要首行显示的维度字段,重复步骤2的表达式设置
4. 预览验证
保存报表设计后点击预览,检查同一患者的目标字段是否仅在首行显示,后续行留空。如果数据排列混乱,检查分组维度、排序规则是否正确,或调整patient_row_num的分区字段(比如业务上需按CONSULT_ID区分患者的不同就诊记录,就把CONSULT_ID加入PARTITION BY子句)。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

