2015-03-02 3 views
0

Когда я запускаю следующий SQL-запрос в SMS, я правильно получаю «нулевые» значения во втором столбце document_desc (from patient_documents_1). Это показывает мне, что документы пациента, которые существуют для определенного пациента, не включают требуемый документ bh_pharm. Отлично!Crystal Report: SQL Subquery Issue with 'null' Результаты

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 Reports?

Все, что я пытаюсь получить в результате пустого отчета. Либо это, либо я должен включать каждую запись и каждое описание документа. Я только хочу, чтобы отчет показал мне, что у пациентов отсутствует документ «bh_pharm». Может ли Crystal Reports обрабатывать «нулевые» результаты из подзапроса или подзаголовка?

Заранее спасибо ...

+0

Какая версия Crystal это? Вы используете команду? – shawnt00

ответ

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 года?

+0

SQL-запрос работает отлично, независимо от того, как я его сломаю. В основном я пытаюсь это сделать: (глупый пример) Если у меня есть книги в моей библиотеке, расскажите мне только список книг, если ни одна из этих книг не является «Остров сокровищ». Если «Остров сокровищ» - одна из книг, мне не нужен список книг. Любой рабочий пример, который вы мне дадите для Crystal Reports, поможет мне выйти на правильный путь. –

+0

Спасибо, bf2020, что очень помогло. Не совсем то, что мне нужно сделать с этим отчетом, но вы ответили на мой вопрос, и он возвращает меня в нужное русло. Еще раз спасибо. –

+0

Эй, Даррил Граймс, можете ли вы перенести или отметить как ответ? – bf2020

0

Откройте отчет о кристалле, а затем выберите команду выбора таблиц и скопируйте туда тот же запрос.

Теперь идите и создайте отчет.

+0

Я тоже это пробовал. Я также попробовал подотчет.Я объяснил свою ситуацию в приведенном выше примере, отвечая на ответ bf2020. –

+0

Формула, которую я пробовал с использованием эксперта select в подчиненном отчете, который явно не прошел, был ... и «bh_pharm» не находится в [{patient_documents.document_description}] ... есть способ динамически создавать список или массив существующих документов в пределах эта формула? –

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