GROUP BY HAVING Логика не работает (минимальные / максимальные даты) - PullRequest
0 голосов
/ 22 марта 2019

У меня есть 2 таблицы: яблоки и апельсины.У Apple есть столбец FirstDate и столбец LastDate для каждого ApplesID.Апельсины имеют только один столбец «Дата» с несколькими записями (вхождениями) для каждого ApplesID, каждый из которых может иметь разные даты.Ни один из них технически не попадает в другой, но логика заключается в том, что min (Oranges.Date) = Apples.FirstDate и max (Oranges.Date) = Apples.LastDate per ApplesID.Я просто запрашиваю, чтобы увидеть, где приведенная выше логика не соответствует действительности.

Ниже мой запрос пытается найти это, но когда я запускаю его и вижу результаты, где приведенная выше логика выполняется и не выполняется,Результаты, в которых содержится логика, не должны быть в наборе результатов.Что я делаю не так?

select distinct 
a.ApplesID
, convert(varchar(10), a.FirstDate, 103) as 'FirstDate'
, convert(varchar(10), a.LastDate, 103) as 'LastDate'
, min(convert(varchar(10), o.Date, 103)) as 'FirstDT'
, max(convert(varchar(10), o.Date, 103)) as 'LastDT'
from Apples a with(nolock)
join Oranges o with(nolock)
    on o.ApplesID = a.ApplesID
where (o.Date between '01/01/2018' and '02/28/2019' and a.FirstDate >= '01/01/2018')
    and a.ApplesID > 0
    and a.Deleted = 0
group by a.ApplesID, a.FirstDate, a.LastDate
having (min(o.Date) <> a.FirstDate or max(o.Date) <> a.LastDate)
order by a.ApplesID

1 Ответ

0 голосов
/ 22 марта 2019

Вы должны сделать это И ИМЯ, а не ИЛИ. ИЛИ проверяет одно из условий фильтрации ... так, что одно делает его истинным, а другое - другим (или наоборот).

select distinct 
a.ApplesID
, convert(varchar(10), a.FirstDate, 103) as 'FirstDate'
, convert(varchar(10), a.LastDate, 103) as 'LastDate'
, min(convert(varchar(10), o.Date, 103)) as 'FirstDT'
, max(convert(varchar(10), o.Date, 103)) as 'LastDT'
from Apples a with(nolock)
join Oranges o with(nolock)
    on o.ApplesID = a.ApplesID
where (o.Date between '01/01/2018' and '02/28/2019' and a.FirstDate >= '01/01/2018')
    and a.ApplesID > 0
    and a.Deleted = 0
group by a.ApplesID, a.FirstDate, a.LastDate
having ((min(o.Date) <> a.FirstDate) AND (max(o.Date) <> a.LastDate))
order by a.ApplesID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...