2011-06-05 143 views
1

甲骨文选择最高的日期,我有点难倒就如何做到这一点。我想从表“代理”中选择记录,并将这两个表共享一个id列的表“记录”。每个记录

表结构:

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天内没有注释的任何代理机构,显示地址和名称以及最后一个注释日期。 (而不是显示每次访问后的天数,我想显示自上次访问以来已经过去的天数 - 每个不同的机构,街道,城市)。

这是一个应用程序,它可以帮助销售主管安排销售电话并每周运行两次。我一直无法弄清楚。另外,请记住,使用的实际表格更具描述性 - 我在这里使用的仅仅是描述问题所需的部分。

我将不胜感激就如何解决这个问题的任何建议。

谢谢!

回答

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; 
+0

谢谢!我将不得不阅读关于NOT EXISTS条件的更多信息,以便我可以更好地理解它。非常感激! – Jinx3y 2011-06-05 21:06:16