繁体   English   中英

水晶报表的SQL查询

[英]SQL Query for Crystal Reports

我很难通过Crystal报表从SQL数据库获取信息。 由于无法获得SQL查询来返回所需的数据,因此我正在考虑直接构造查询,而不是让Crystal Reports构造查询。

我正在使用的表如下所示:

Table: system.view_episode_summary_current
    +------------+----------------+------------+----------------+------------------------+
    | patient_id | episode_number | admit_date | discharge_date | attending_practitioner |
    +------------+----------------+------------+----------------+------------------------+
    | 111        | 4              | 01/05/2017 |                | 4444                   |
    +------------+----------------+------------+----------------+------------------------+
    | 222        | 8              | 03/17/2017 |                | 5555                   |
    +------------+----------------+------------+----------------+------------------------+
    | 222        | 9              | 03/20/2017 |                | 6666                   |
    +------------+----------------+------------+----------------+------------------------+
    | 333        | 2              | 10/08/2017 |                |                        |
    +------------+----------------+------------+----------------+------------------------+

    Table: system.user_practitioner_assignment
    +------------+----------------+---------------------+--------------------+
    | patient_id | episode_number | backup_practitioner | date_of_assignment |
    +------------+----------------+---------------------+--------------------+
    | 111        | 4              |                     |                    |
    +------------+----------------+---------------------+--------------------+
    | 222        | 8              | 7777                | 03/17/2017         |
    +------------+----------------+---------------------+--------------------+
    | 222        | 8              | 4444                | 05/18/2017         |
    +------------+----------------+---------------------+--------------------+
    | 222        | 9              |                     |                    |
    +------------+----------------+---------------------+--------------------+
    | 333        | 2              | 4444                | 10/08/2017         |
    +------------+----------------+---------------------+--------------------+
    | 333        | 2              | 5555                | 10/19/2017         |
    +------------+----------------+---------------------+--------------------+

我需要的SQL查询从system.view_episode_summary_current表返回patient_id,EPISODE_NUMBERadmit_date每当工作人员X是attending_practitioner最近指派 backup_practitioner。

我已经能够让Crystal Reports返回以下任一内容:

+-------------+------------+----------------+------------+
    | {?Staff_ID} | patient_id | episode_number | admit_date |
    +-------------+------------+----------------+------------+
    | 4444        | 111        | 4              | 01/05/2017 |
    +-------------+------------+----------------+------------+

或这个:

+-------------+------------+----------------+------------+
    | {?Staff_ID} | patient_id | episode_number | admit_date |
    +-------------+------------+----------------+------------+
    | 4444        | 222        | 8              | 03/17/2017 |
    +-------------+------------+----------------+------------+

但这不是,这是我需要的结果:

+-------------+------------+----------------+------------+
    | {?Staff_ID} | patient_id | episode_number | admit_date |
    +-------------+------------+----------------+------------+
    | 4444        | 111        | 4              | 01/05/2017 |
    +-------------+------------+----------------+------------+
    | 4444        | 222        | 8              | 03/17/2017 |
    +-------------+------------+----------------+------------+

我无法弄清楚如何使Crystal Reports OR语句正常工作,并且不确定是否使用了正确的JOIN类型。 这就是为什么我要查看直接的SQL查询命令而不是让Crystal Reports构造SQL查询的原因。

更新:

所以我尝试了几件事,但是没有成功。

首先,SQL处理程序对于查询中的别名不善于选择,因此我删除了它们。 (我认为如果别名名称的长度至少为3个字符,我可以使用别名,但是我需要对其进行更多测试。)

接下来,它抛出NULL子句并出错,因此我对其进行了调整,直到通过它们为止。

这是查询当前的样子:

SELECT * 
  FROM (SELECT system.view_episode_summary_current.patient_id, 
               system.view_episode_summary_current.episode_number, 
               system.view_episode_summary_current.admit_date,
               system.view_episode_summary_current.attending_practitioner,
               CASE WHEN (system.user_practitioner_assignment.date_of_assignment IS NOT NULL)
                     AND (LAG(system.user_practitioner_assignment.date_of_assignment) OVER
                             ( PARTITION BY system.user_practitioner_assignment.patient_id
                                   ORDER BY system.user_practitioner_assignment.date_of_assignment
                             ) IS NOT NULL) THEN 
                             LAG(system.user_practitioner_assignment.backup_practitioner) OVER
                                 ( PARTITION BY system.user_practitioner_assignment.patient_id
                                       ORDER BY system.user_practitioner_assignment.date_of_assignment
                                 ) 
                END AS Last_Backup
        FROM system.view_episode_summary_current
       INNER -- WRITE JOINS LIKE THIS!!!
        JOIN system.user_practitioner_assignment
          ON system.view_episode_summary_current.patient_id = system.user_practitioner_assignment.patient_id
         AND system.view_episode_summary_current.episode_number = system.user_practitioner_assignment.episode_number
       ) TMP
 WHERE TMP.attending_practitioner = '4444'
    OR TMP.last_backup = '4444';

现在,它在OVER子句上引发错误。 我假设这意味着它已经够老了,它不知道如何处理SQL窗口函数。 所以现在我想弄清楚如何使用自连接和MAX()子句重写LAG内容。

我是SQL的新手。 例如,根据我观察到的情况,我假设SQL查询中的大写字母(大部分)是不相关的,但我不确定。 我一直在互联网上寻求帮助,但没有发现任何可以使我工作或理解的有用信息(在这一点上,大多数感觉像是外语)。 我在工作内部和外部都知道SQL的人很困惑,但这是事实。 我在这里超出了我的深度,因此我们将不胜感激。

您应该使用显式联接语法(请参见粗体)。

但是,这样的事情可能会解决问题:

SELECT * 
  FROM (SELECT a.patient_id, 
               a.episode_number, 
               a.admit_date,
               a.attending_practitioner,
               CASE WHEN B.date_of_assignment IS NOT NULL
                     AND LAG(B.date_of_assignment) OVER
                             ( PARTITION BY B.patient_id
                                   ORDER BY B.date_of_assignment
                             ) IS NOT NULL THEN 
                             LAG(B.backup_practitioner) OVER
                                 ( PARTITION BY B.patient_id
                                       ORDER BY B.date_of_assignment
                                 ) 
                END AS Last_Backup
        FROM system.view_episode_summary_current a
       INNER -- WRITE JOINS LIKE THIS!!!
        JOIN system.user_practitioner_assignment b
          ON a.patient_id = b.patient_id
         AND a.episode_number = b.episode_number
       ) TMP
 WHERE TMP.attending_practitioner = '4444'
    OR TMP.last_backup = '4444';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM