SQL-запрос с несколькими диапазонами дат и Full Join - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть SQL-запрос, выполняющий FULL JOIN для нескольких таблиц базы данных. Запрос является динамическим на основе пользовательского ввода, но для примера я просто включил некоторые возможные входные данные.

У меня возникла проблема: мне нужно отфильтровать по нескольким диапазонам дат и вернуть результаты запроса, если они попадают в какой-либо диапазон дат.

Запрос, который у меня сейчас есть:

SELECT rank=COUNT(*)
   FROM    [LOM].[dbo].[lom_problem] problem
       FULL JOIN [LOM].[dbo].[lom_batch] batch on problem.lom_number = batch.lom_number
       FULL JOIN [LOM].[dbo].[lom_specimen] specimen on problem.lom_number = specimen.lom_number
       FULL JOIN [LOM].[dbo].[Main_LOM_Form] main on problem.lom_number = main.lom_number
           WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')
           AND main.occurrence_date >=Convert(datetime,'01/04/2012') AND main.occurrence_date <= Convert(datetime,'01/05/2012')
           OR main.received_date>=Convert(datetime,'01/04/2012') AND main.received_date <= Convert(datetime,'01/05/2012')

Однако запрос возвращает результаты, как если бы мой запрос был СУММОЙ

SELECT rank=COUNT(*)
   FROM    [LOM].[dbo].[lom_problem] problem
       FULL JOIN [LOM].[dbo].[lom_batch] batch on problem.lom_number = batch.lom_number
       FULL JOIN [LOM].[dbo].[lom_specimen] specimen on problem.lom_number = specimen.lom_number
       FULL JOIN [LOM].[dbo].[Main_LOM_Form] main on problem.lom_number = main.lom_number
           WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')
   AND main.occurrence_date >=Convert(datetime,'01/04/2012') AND main.occurrence_date <= Convert(datetime,'01/05/2012')

и

SELECT rank=COUNT(*)
   FROM    [LOM].[dbo].[lom_problem] problem
       FULL JOIN [LOM].[dbo].[lom_batch] batch on problem.lom_number = batch.lom_number
       FULL JOIN [LOM].[dbo].[lom_specimen] specimen on problem.lom_number = specimen.lom_number
       FULL JOIN [LOM].[dbo].[Main_LOM_Form] main on problem.lom_number = main.lom_number
           WHERE main.received_date>=Convert(datetime,'01/04/2012') AND main.received_date <= Convert(datetime,'01/05/2012')

Как получить запрос на возврат результатов с неповрежденной этой частью:

SELECT rank=COUNT(*)
   FROM    [LOM].[dbo].[lom_problem] problem
       FULL JOIN [LOM].[dbo].[lom_batch] batch on problem.lom_number = batch.lom_number
       FULL JOIN [LOM].[dbo].[lom_specimen] specimen on problem.lom_number = specimen.lom_number
       FULL JOIN [LOM].[dbo].[Main_LOM_Form] main on problem.lom_number = main.lom_number
           WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')

плюс фильтрация для любого диапазона дат поверх этого:

           AND main.occurrence_date >=Convert(datetime,'01/04/2012') AND main.occurrence_date <= Convert(datetime,'01/05/2012')
           OR main.received_date>=Convert(datetime,'01/04/2012') AND main.received_date <= Convert(datetime,'01/05/2012')

Спасибо!

Edit: Мне нужно фильтровать на основе диапазона данных main.occurrence_date и main.received_date. Если диапазон данных присутствует в одном или другом столбце, мне нужно вернуть счетчик. Тем не менее, запрос, который у меня есть, теперь возвращает сумму первой части инструкции where, а затем результаты второй части (после ИЛИ). Я подумал, что это может быть просто проблема синтаксиса / форматирования, но не был уверен.

1 Ответ

3 голосов
/ 03 февраля 2012

Не забывайте свои круглые скобки:

       WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')
       AND ((main.occurrence_date >=Convert(datetime,'01/04/2012') AND main.occurrence_date <= Convert(datetime,'01/05/2012'))
       OR (main.received_date>=Convert(datetime,'01/04/2012') AND main.received_date <= Convert(datetime,'01/05/2012'))

РЕДАКТИРОВАТЬ: ОК, давайте попробуем еще раз.Я полагаю, что предложение acermate433s сделает его более читабельным:

       WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')
       AND (main.occurrence_date BETWEEN Convert(datetime,'01/04/2012') AND Convert(datetime,'01/05/2012'))
       OR (main.received_date BETWEEN Convert(datetime,'01/04/2012') AND Convert(datetime,'01/05/2012'))

Это то, что вы имели в виду?Он будет считать все записи, которые имеют occurance_date в указанном диапазоне, и все записи, которые получили_дату в указанном диапазоне, не считая их дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...