Список пользователей, у которых нет транзакций после даты 'x' - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть запрос, который мне нужно создать, который извлекает данные из трех разных таблиц. По сути, конечным результатом является получение данных для пользователей, которые не выполняли никаких действий в учетной записи пользователя с 01.07.2008, но у них должен быть план учетной записи как «x». Есть ли способ манипулировать этим запросом, который я создал, чтобы он отображал то, что мне нужно? Может быть, как-то соотнести это с счетом 0 в столбце TRANDATE? Очень потерянный здесь и мог бы помочь!

select p.ID as ID, p.LAST as LastName, p.FIRST as FirstName
From gl
inner join p
on p.ID = gl.PID
left join psp
on psp.PLANNUM = gl.ACCNUM
where gl.ACCNUM = 'x'
and psp.ACTIVE = 1
and gl.TRANDATE <= to_date('07/01/2018', 'MM/DD/YYYY') 
;
commit;

Большое спасибо всем, и, пожалуйста, дайте мне знать, если я еще что-нибудь смогу здесь предоставить.

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Вы на самом деле не указываете свою структуру таблицы, так что я немного догадываюсь здесь. Есть ли в вашей таблице "gl" более одной записи на PID + ACCNUM? Какие первичные ключи? Вы можете предоставить множество дополнительных деталей.

select p.ID as ID, p.LAST as LastName, p.FIRST as FirstName, g.maxdate
From (select gl.PID, gl.ACCNUM, max(gl.TRANDATE) as maxdate
    from gl
    where gl.ACCNUM = 'x'
    group by gl.PID, gl.ACCNUM) g
inner join p
on p.ID = g.PID
inner join psp
on psp.PLANNUM = g.ACCNUM
and psp.ACTIVE = 1
where g.maxdate <= to_date('07/01/2018', 'MM/DD/YYYY') 
;

Кроме того, (а) вам не требуется фиксация для выбора, и (б) левое / внешнее соединение является внутренним соединением, когда у вас есть столбец в предложении WHERE (psp.ACTIVE = 1).

0 голосов
/ 10 сентября 2018

Я бы просто использовал агрегацию и max() в предложении having:

select p.ID as ID, p.LAST as LastName, p.FIRST as FirstName
from gl inner join
     p
     on p.ID = gl.PID inner join
     psp
     on psp.PLANNUM = gl.ACCNUM
where gl.ACCNUM = 'x' and psp.ACTIVE = 1
group by p.ID, p.LAST, p.FIRST
having max(gl.TRANDATE) <= date '2018-07-01';

Обратите внимание, что условие where для psp.ACTIVE превращает внешнее соединение во внутреннее соединение, поэтому яизменен тип join для удобства чтения.

0 голосов
/ 10 сентября 2018

Поскольку все ваши поля отображения взяты из p, вы можете выполнить группировку во внутреннем запросе для p.id, который встречается более одного раза.Все остальные идентификаторы (не в) вас интересуют.

   select p.ID as ID, p.LAST as LastName, p.FIRST as FirstName
    From p where p.ID not in (
         select p.ID From gl
            inner join p on p.ID = gl.PID
            left join psp on psp.PLANNUM = gl.ACCNUM
            where gl.ACCNUM = 'x'
            and psp.ACTIVE = 1
            and gl.TRANDATE <= to_date('07/01/2018', 'MM/DD/YYYY')
            group by p.ID
            having count(1) >= 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...