对于如何做到这一点,我有点难过。我想从一个表“agency”中选择记录,这些表连接到两个表共享的id列上的表“notes”。
表格结构:
create table notes (
notes_id varchar2(5),
agency_gp_id varchar2(5),
call_date date,
call_note varchar2(4000)
);
create table agency(
agency_id varchar2(5),
agency_name varchar2(5),
street varchar2(75),
city varchar2(50)
);
alter table notes add constraint "fk_group_notes_agency_id" foreign key(agency_gp_id)
references agency(agency_id) enable;
- 每个表都有自动编号,“插入前”触发器,因此id号码保持同步(以及在向新创建的代理商添加注释的情况下的其他内容) - 我需要它做的一切(数据库),确实如此。
- 代理商表中的每个记录都有一个不同的名称/地址组合(在不同城市中有不同的分支),并且备注表中的每个记录都有一个对应于每个代理商的日期条目。
- 每个代理机构都可以有多个备注(后续访问的多个备注详情)
我要做的是选择在过去四个月内没有添加注释的每个(不同的代理商,街道,城市)。
这是我提出的查询:
SELECT count(a.agency_name) as number_of_visits,
a.agency_name,
(a.street||', '||a.city) as "Location",
n.call_date,
ROUND(TRUNC(sysdate - call_date)) AS days_since_visit
FROM notes n, agency a
WHERE (sysdate - n.call_date) > 120
AND n.agency_gp_id = a.agency_id
--AND a.city = 'München' --not necessary, used for limiting number of results
GROUP BY n.call_date,a.agency_name,a.street, a.city
ORDER BY a.agency_name ASC, n.call_date desc;
它有点工作......我可以看到我想要的东西,但我也看到了我不想要的东西(例如每个机构的多个笔记)。我唯一想看的是每个机构的最后一个条目(最近,根据WHERE子句)。我要创建的图片是:对于在最后一个音符的120天内未注释的任何代理商,请显示地址和姓名以及最后一个音符日期。 (而不是显示自每次访问以来的天数,我想显示自上次访问以来过去的天数 - 每个不同的机构,街道,城市)。
这是一个应用程序,可以帮助销售主管安排她的销售电话,并每周运行两次。我一直无法弄清楚这一点。另外,请记住,使用的实际表格更具描述性 - 我在这里使用的只是我描述问题所需的部分。
我很感激有关如何解决这个问题的任何建议。
谢谢!
答案 0 :(得分:1)
如果我正确理解您的问题,将call_date更改为MAX(call_date)(并将其从GROUP BY语句中删除)应该可以获得您想要的数据条款,但也会引入误报,即任何代理商不管最近的笔记如何,都有超过120天的笔记。如果我们在NOT EXISTS子查询中过滤掉那些代理,那么这应该可以让你到达目的地。
SELECT count(a.agency_name) as number_of_visits,
a.agency_name,
(a.street||', '||a.city) as "Location",
MAX(n.call_date),
ROUND(TRUNC(sysdate - MAX(call_date))) AS days_since_visit
FROM notes n, agency a
WHERE (sysdate - n.call_date) > 120
AND n.agency_gp_id = a.agency_id
AND NOT EXISTS (SELECT 1 FROM notes n2
WHERE n2.agency_gp_id = a.agency_id
AND (sysdate - n2.call_date) <= 120)
--AND a.city = 'München' --not necessary, used for limiting number of results
GROUP BY a.agency_name,a.street, a.city
ORDER BY a.agency_name ASC, MAX(n.call_date) desc;