【问题标题】:Ignore suppressed records in crosstab忽略交叉表中的抑制记录
【发布时间】:2016-11-08 22:50:20
【问题描述】:

我的报告仅根据date_of_diagnosis 显示每位患者的最新诊断 - 所有其他记录均被禁止:

我在交叉表中按诊断和年龄组进行总结。交叉表在打印之前进行评估,因此任何抑制、共享变量或汇总的尝试都会发生在交叉表填充之后。这意味着每个年龄组的总数是正确的,因为每个患者只有一个年龄 - 但如果患者有多个诊断,即使他们被抑制,他们也会被多次计算: p>

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


Crystal 自动生成的 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"

【问题讨论】:

  • 只是说:如果您不使用被抑制的数据,那么也许您可以在查询中添加条件:AND Date_Of_Diagnosis IS NOT NULL
  • 请注意:这不是一种实用的连接表格的方法,您应该尝试使用 LEFT 或 INNER JOIN
  • @Zeina(我知道。这只是 Crystal 自动生成的查询。如果我需要重写查询来解决这个问题,我将使用 Joins。)问题不在于当诊断日期为空,即诊断日期不是每位患者的最新诊断。交叉表忽略任何抑制。
  • 您应该在数据库中创建一个视图来抑制所有患者的旧诊断,然后将其用作报告的来源。
  • 您可以在 Crystal Report 中创建查询。检查this

标签: sql crystal-reports crosstab


【解决方案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,并通过过滤器参数来获得该患者的最后诊断。

【讨论】:

    【解决方案2】:

    根据 Muffaddal Shakir 的回答,我能够编写此查询来执行正确的过滤器:

    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" - 如果没有这个,查询只会拉回一个诊断(整个系统中最新的一个)。但现在它会检查每个人的最新诊断

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 2013-07-10
      • 2012-08-06
      • 2013-02-18
      • 2023-04-01
      • 1970-01-01
      • 2022-10-18
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多