Crystal Report:带有'null'结果的SQL子查询问题

时间:2015-03-02 22:33:23

标签: sql-server crystal-reports

当我在SMS中运行以下SQL查询时,我在第二个document_desc列(来自patient_documents_1)中正确获取“null”值。这表明,对于某个患者存在的患者文档不包括所需的bh_pharm文档。完美!

SELECT
patients.last_name, patients.first_name, 
patient_documents.document_description,
patient_documents_1.document_description
FROM patients
INNER JOIN patient_documents ON patients.pat_id = patient_documents.pat_id 
LEFT OUTER JOIN (
    select patient_documents.pat_id, patient_documents.document_description
    from patient_documents where patient_documents.document_description = 'bh_pharm' )
    as patient_documents_1 ON patients.pat_id = patient_documents_1.pat_id
WHERE
( patient_documents.timestamp >= {ts '2015-02-01 00:00:00'} AND patient_documents.timestamp < {ts '2015-03-01 00:00:00'} ) AND 
patient_documents_1.document_description is null

如何在Crystal Report中执行此操作?

我尝试的所有内容都会导致报告空白。要么我必须包括每个记录和每个文档描述。我只希望报告向我展示患者缺少“bh_pharm”文件的内容。 Crystal Reports可以处理子查询或子报表的“空”结果吗?

提前致谢...

3 个答案:

答案 0 :(得分:0)

没有LEFT JOIN到子查询,它是否有效?也就是说,你在取消加入和所有对patient_documents_1的引用后得到了结果?

如果没有,请确保您正在配置水晶报告以正确查询SQL Server。

编辑: 这有用吗?它可能是花括号,但我也做了一些无偿的改写......

    WITH patient_documents_1 as
    (
        select patient_documents.pat_id
        from patient_documents 
where patient_documents.document_description = 'bh_pharm'
group by patient_documents.pat_id
    ),
    noBH as (
    SELECT
    patients.last_name, 
    patients.first_name, 
    patients.pat_id
    FROM patients
    LEFT OUTER JOIN patient_documents_1 on patients.pat_id = patient_documents_1.pat_id
    WHERE
    patient_documents_1.document_description is null 
    )
    Select 
    noBH.*,
    patient_documents.document_description
    from noBH
    INNER JOIN patient_documents ON noBH.pat_id = patient_documents.pat_id
    WHERE
    patient_documents.timestamp between '2015-02-01' and '2015-02-28'

哦,是的,是否有患者没有bh_pharm文件,但在2015年2月确实有时间戳?

答案 1 :(得分:0)

然后打开水晶报告,而不是选择表格select命令并在那里复制相同的查询。

现在去设计并生成报告。

答案 2 :(得分:0)

从新报告开始。

您需要添加到报告中的唯一表是patients表。 (如果您使用别名,请确保在下面的查询中进行更改。)

添加SQL表达式以返回计数。当没有找到具有正确描述的文档时,它将评估为零。复制下面的所有内容,包括括号。称之为DocumentCount

(
select count(*)
    from patient_documents as pd
where
    pd.document_description = 'bh_pharm'
    and pd.pat_id = patients.pat_id  /* alias on "patients" must match */
)

在记录选择公式中添加一个过滤器,将其限制为您要显示的过滤器。

{%DocumentCount} = 0