Навигация:  МОДУЛЬ "СИСТЕМНОЕ ЯДРО" > ПОДМОДУЛЬ "СТАТИСТИКА" > Простые запросы > Визуальный конструктор запросов >

Подзапросы

Предыдущая страницаВернуться в начало главыСледующая страница

Рассмотрим использование подзапросов на примере запроса Счета (рис. 2.3.16).

В данном запросе нужна возможность отфильтровывать неоплаченные счета пациентов. Так как у счета нет признака "Оплачен", для поиска неоплаченных счетов настраивается подзапрос nopaid, в котором анализируется задолженность пациентов.

Основной запрос строится по таблице Счета, к которой присоединяются необходимые дополнительные таблицы. У основного запроса условие в секции WHERE выглядит следующим образом:

(FM_INVOICE.FM_INVOICE_ID in ([nopaid]) and :nopaid=%ParseLangStringDef('#fra#OUI#rus#ДА#eng#YES') and FM_INVOICE.INVOICE_STATE <>'D')

Если задан параметр Только неоплаченные счета (:nopaid ='ДА'), выбираются FM_INVOICE_ID (счета), принадлежащие множеству [nopaid], определяемому подзапросом, при этом статус счета (INVOICE_STATE) не должен быть "Отменен" ('D').

 Рисунок 2.3.16. Запрос "Счета"


Рисунок 2.3.16. Запрос "Счета"

286

Для создания подзапроса нужно встать курсором на месте, где должен находиться подзапрос, и в меню кнопки Добавить или в контекстном меню выполнить команду Подзапрос.

Откроется окно конструктора запросов (рис. 2.3.17). Для подзапроса необходимо указать имя и формулу связи с основным запросом. Для поиска неоплаченных счетов используется основная таблица Оплата по задолженностям за услуги (FM_PAYMENTS) и связанная с ней таблица Счет (Счета)(FM_INVOICE).

Имя подзапроса – nopaid, формула связи:

FM_INVOICE.FM_INVOICE_ID =FM_INVOICE00.FM_INVOICE_ID,

где FM_INVOICE00 — алиас таблицы FM_INVOICE. Таким образом, связь осуществляется по ID счета.

Опция SELECT DISTINCT позволяет исключить повторяющиеся одинаковые записи.

 Рисунок 2.3.17. Создание подзапроса: выбор таблиц и задание условий


Рисунок 2.3.17. Создание подзапроса: выбор таблиц и задание условий

В секции WHERE прописывается условие, по которому отфильтровываются только счета пациентов:

FM_INVOICE00.PATIENTS_ID is not null

В секции HAVING условие

ISNULL( sum(case when FM_PAYMENTS.TRAN_AMOUNT> 0 then FM_PAYMENTS.TRAN_AMOUNT else 0 end), 0) < min(FM_INVOICE00.TOTAL_AMOUNT)

позволяет найти неоплаченные или частично оплаченные счета: считается сумма неотрицательных транзакций (TRAN_AMOUNT) и проверяется, меньше ли она выставленной по счету суммы к оплате (TOTAL_AMOUNT).

На закладке Запрашиваемые данные выбирается одно поле — FM_INVOICE_ID таблицы Счет (Счета), по которому устанавливается группировка (рис. 2.3.18).

 Рисунок 2.3.17. Создание подзапроса: запрашиваемые данные


Рисунок 2.3.17. Создание подзапроса: запрашиваемые данные

Таким образом, подзапрос возвращает множество FM_INVOICE_ID — неоплаченных счетов пациентов.

Далее в основном запросе Счета создается параметр NOPAIDис. 2.3.18).

Таким образом, при выполнении запроса можно задать значение этого параметра, равным "ДА" — будут отобраны счета подзапросом nopaid, иначе будут отображены все счета.

 Рисунок 2.3.18. Параметр NOPAID


Рисунок 2.3.18. Параметр NOPAID