在“ x”日期之后没有交易的用户列表

时间:2018-09-10 18:01:44

标签: sql oracle

我需要创建一个查询,该查询从三个不同的表中提取数据。从本质上讲,最终结果是为自2018年7月1日以来未在用户帐户上进行任何活动的用户提取数据,但他们必须将帐户计划设置为“ x”。有没有一种方法可以处理我创建的此查询,以使其显示所需的内容?也许以某种方式将其与TRANDATE列上的0计数相关联?在这里很迷路,可以寻求帮助!

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 :(得分:1)

您实际上并未指定表结构,因此我在这里有点猜测。您的“ 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') 
;

此外,(a)您不需要对select进行提交,并且(b)当您的WHERE子句中的列(psp.ACTIVE = 1)时,左/外联接是内部联接。 / p>

答案 1 :(得分:1)

我只会在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类型。

答案 2 :(得分:0)

由于所有显示字段都来自p,因此您可以在内部查询中对p.id进行分组,该分组会多次出现。所有其余的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)