2016-10-17 122 views
1

我的报告显示,根据每个病人只有最新诊断其date_of_diagnosis - 所有其他记录被抑制:忽略交叉抑制记录

Records after suppression

我在交叉表诊断和年龄组的总结。交叉表在打印之前进行评估,所以任何试图抑制,共享变量或总结之后会填充交叉表。这意味着总在各年龄组是正确的,因为每个病人只有一岁 - 但如果患者有一个以上的诊断,即使他们压制,他们获得多次计算:

Crosstab (Much larger in real life. Simplified/cropped for screenshot)

我绝对是必须由于涉及大量的诊断和年龄组,因此使用交叉表。我怎样才能让交叉表忽略被压制的记录?或者,如果我需要使用自定义的SQL命令表,我如何重写现有的SQL以忽略过时的记录?


水晶的自动生成的SQL(通过ODBC):

SELECT "Codes"."diagnosis_code", 
     "Codes"."diagnosis_value", 
     "Codes"."PATID", 
     "Codes"."FACILITY", 
     "Codes"."EPISODE_NUMBER", 
     "Record"."date_of_diagnosis" 

FROM "SYSTEM"."Codes" "Codes", 
     "SYSTEM"."Entry" "Entry", 
     "SYSTEM"."Record" "Record" 

WHERE "Codes"."DiagnosisEntry"="Entry"."ID" AND 
     "Codes"."EPISODE_NUMBER"="Entry"."EPISODE_NUMBER" AND 
     "Codes"."FACILITY"="Entry"."FACILITY" AND 
     "Codes"."PATID"="Entry"."PATID" AND 
     "Entry"."DiagnosisRecord"="Record"."ID" AND 
     "Entry"."EPISODE_NUMBER"="Record"."EPISODE_NUMBER" AND 
     "Entry"."FACILITY"="Record"."FACILITY" AND 
     "Entry"."PATID"="Record"."PATID" 
+0

只是说:如果你不会使用抑制数据,那么也许你可以添加一个条件到你的查询:'AND Date_Of_Diagnosis IS NOT NULL' – Zeina

+0

只是一个注意:这不是一个实际的方式来加入你的你应该尝试使用LEFT或INNER JOIN – Zeina

+0

@Zeina(我知道,这只是Crystal自动生成的查询,如果我需要重写查询来解决这个问题,我将使用Joins。)问题不是当诊断日期为空时,诊断日期不是每位患者的最新*诊断时。交叉表忽略任何抑制。 – 4444

回答

0

大厦关闭Muffaddal沙基尔的回答,我能写这个查询来执行正确的过滤器:

SELECT "Codes"."PATID", 
     "Codes"."diagnosis_code", 
     "Codes"."diagnosis_value", 
     "Codes"."FACILITY", 
     "Codes"."EPISODE_NUMBER", 
     "Record"."date_of_diagnosis" 

FROM "SYSTEM"."codes" "Codes", 
    "SYSTEM"."entry" "Entry", 
    "SYSTEM"."record" "Record" 

WHERE "Codes"."DiagnosisEntry"="Entry"."ID" AND 
     "Codes"."EPISODE_NUMBER"="Entry"."EPISODE_NUMBER" AND 
     "Codes"."FACILITY"="Entry"."FACILITY" AND 
     "Codes"."PATID"="Entry"."PATID" AND 
     "Entry"."DiagnosisRecord"="Record"."ID" AND 
     "Entry"."EPISODE_NUMBER"="Record"."EPISODE_NUMBER" AND 
     "Entry"."FACILITY"="Record"."FACILITY" AND 
     "Entry"."PATID"="Record"."PATID" 

AND "Record"."date_of_diagnosis" = ( 
    SELECT MAX("Record2"."date_of_diagnosis") 

    FROM "SYSTEM"."entry" "Entry2", 
     "SYSTEM"."record" "Record2" 

    WHERE "Entry2"."DiagnosisRecord"="Record2"."ID" AND 
      "Entry2"."EPISODE_NUMBER"="Record2"."EPISODE_NUMBER" AND 
      "Entry2"."FACILITY"="Record2"."FACILITY" AND 
      "Entry2"."PATID"="Record2"."PATID" AND 
      "Record"."PATID"="Record2"."PATID" 
) 

的主要区别是:

  1. 子查询使用唯一的别名从主查询。
  2. 最后一行"Record"."PATID"="Record2"."PATID" - 如果没有这个,查询只拉回一个诊断(最新一个在整个系统中)。但现在检查每人最近诊断
1

你只需要一套诊断中的最新诊断。所以我建议:

SELECT "Codes"."PATID", 
    "Codes"."diagnosis_code", 
    "Codes"."diagnosis_value", 
    "Codes"."FACILITY", 
    "Codes"."EPISODE_NUMBER", 
    "Record"."date_of_diagnosis" 

FROM "SYSTEM"."Codes" "Codes", 
    "SYSTEM"."Entry" "Entry", 
    "SYSTEM"."Record" "Record" 

WHERE "Codes"."DiagnosisEntry"="Entry"."ID" AND 
    "Codes"."EPISODE_NUMBER"="Entry"."EPISODE_NUMBER" AND 
    "Codes"."FACILITY"="Entry"."FACILITY" AND 
    "Codes"."PATID"="Entry"."PATID" AND 
    "Entry"."DiagnosisRecord"="Record"."ID" AND 
    "Entry"."EPISODE_NUMBER"="Record"."EPISODE_NUMBER" AND 
    "Entry"."FACILITY"="Record"."FACILITY" AND 
    "Entry"."PATID"="Record"."PATID" 
    AND "Entry"."date_of_diagnosis" = (SELECT MAX("date_of_diagnosis") FROM  
    "DiagonsisRecord" "A" WHERE "A"."DiagnosisRecord"="Entry"."DiagnosisRecord" ) 

这应该让每个病人的最大Date_of_Diagnosis并通过滤波器参数来获取患者的最后诊断。