2016-08-04 5 views
1

Наличие проблемы с записью отчета. Я пытаюсь рассчитывать на количество запросов. Выдано и прошло, у обоих у них есть поле даты datetime.Количество На основании 2 дат Диапазоны для 2 разных столбцов

Проблема, возникшая в результате, является неправильной.

Выполнение этого кода дает мне 126 за прошедший

SELECT COUNT(*) AS Passed FROM BPS.dbo.tbl_Profile AS p 
Inner Join BPS.dbo.tbl_Profile_Mortgage AS pm 
ON p.Id = pm.FK_ProfileId 
WHERE p.CaseTypeId IN (1,2,9,15) AND CONVERT(DATE,pm.DatePassed,103) BETWEEN @Start AND @End 

Когда я запускаю выданный запрос я получаю 223

SELECT COUNT(*) AS Issued FROM BPS.dbo.tbl_Profile AS p 
Inner Join BPS.dbo.tbl_Profile_Mortgage AS pm 
ON p.Id = pm.FK_ProfileId 
WHERE p.CaseTypeId IN (1,2,9,15) AND CONVERT(DATE,pm.DateAppIssued,103) BETWEEN @Start AND @End 

Эти цифры являются правильными, так что я положил его в одном запросе, как это.

SELECT COUNT(pm.DateAppIssued) AS Issued,COUNT(pm.DatePassed) AS Passed FROM BPS.dbo.tbl_Profile AS p 
Inner Join BPS.dbo.tbl_Profile_Mortgage AS pm 
ON p.Id = pm.FK_ProfileId 
WHERE p.CaseTypeId IN (1,2,9,15) 
AND (CONVERT(DATE,pm.DateAppIssued,103) BETWEEN @Start AND @End 
OR CONVERT(DATE,pm.DatePassed,103) BETWEEN @Start AND @End) 

Это дает мне Выдано 265 и прошел 185 Я попробовал много разных вариации, но до сих пор не могу получить правильные цифры Я надеюсь, что я объяснил это достаточно хорошо, любая помощь будет оценена. Rusty

ответ

2

Поскольку у вас есть оба условия в предложении where с условием or, вы видите другой результат. Используйте их в самой агрегации.

SELECT 
COUNT(case when CONVERT(DATE,pm.DateAppIssued,103) BETWEEN @Start AND @End then 1 end) AS Issued, 
COUNT(case when CONVERT(DATE,pm.DatePassed,103) BETWEEN @Start AND @End then 1 end) AS Passed 
FROM BPS.dbo.tbl_Profile AS p 
Inner Join BPS.dbo.tbl_Profile_Mortgage AS pm ON p.Id = pm.FK_ProfileId 
WHERE p.CaseTypeId IN (1,2,9,15) 
+0

Спасибо, VKP очень ценим, так что в основном ваша поговорка, если есть дата в выпуске или прошедшем, которая соответствует диапазону дат, тогда считайте, что 1. Это идеальное решение, я думал, что могу достичь этого в разделе where. Я собираюсь сохранить этот код для будущего использования, так как у меня есть такие отчеты. – RustyHamster

1

Когда вы COUNT(pm.DateAppIssued) в последнем запросе, все, что вы подсчета являются строки, которые имеют значение для этого поля. Там нет абсолютно никакой логики о том, находится ли дата в определенном диапазоне.

На самом деле это возможно, если ни одна из строк не перекрывается (т.е. все строки с passed в правом диапазоне отличаются от строк с issued в правом диапазоне), и все строки имеют дату, вы бы на самом деле получают число, равное 349 (т.е. 126 + 223).

Решение: В чем проблема с двумя отдельными запросами? Вы хотите два разных номера на основе двух разных критериев, поэтому вы выбираете их отдельно. Это неплохой дизайн; это совершенно разумно.

+0

Привет VoteyDisciple im использует построитель отчетов, чтобы показать результаты запроса, который вы не можете добавить к различным запросам в один набор данных, что означает, что я не могу добавить оба запроса в таблицу – RustyHamster