2016-05-12 53 views
0

我不能得到这个工作,我什么似乎太容易了对不起,但我真的很期待的建议:甲骨文 - 没有得到期望的结果

我有3个表:

事故

(
ACCIDENT_DATE DATE, 
DRIVER_CODE VARCHAR2, 
DAMAGES NUMBER, 
LOCATION_ACCIDENT VARCHAR2, 
CAR_CODE VARCHAR2 
) 

CARS

(
CAR_CODE VARCHAR2, 
MODEL VARCHAR2, 
YEAR VARCHAR2, 
CODE_OWNER VARCHAR2) 
// I didn't use this table ,but it was stated so I didn't want to miss anything 

PERSON

(
CODE VARCHAR2, 
NAME VARCHAR2, 
RESIDENCE VARCHAR2 
) 

查询是:
显示名称,这在过去4个月有超过两起事故的人

我写的代码:

select a.driver_code,a.accident_date,p.name 
from accidents a join p person 
on (a.driver_code=p.code) 
group by a.accident_date,a.driver_code,p.code 
having count (a.accident_date)>2 

它显示1在发生了2起事故的2名驾驶员中,有一次我摆弄了我的表格数据后表示可以找到任何数据。

我知道我并没有解决它在过去4个月的部分,因为我不知道如何使用它。这是我的想法,虽然我知道这将显示(或想反正)系统的日期和而我想在过去4个月,显示驱动器的事故发生日期(全部)之间的月份:

select a.driver_code,a.accident_date,p.name, 
    sysdate,accident_date, 
    months_between(sysdate,accident_date) 
    from accidents a join p person 
    on (a.driver_code=p.code) 
    group by a.accident_date,a.driver_code,p.code 
    having count (a.accident_date)>2 
+1

一般GROUP BY规则说:如果指定了GROUP BY子句,SELECT列表中的每个列引用都必须标识分组列或者是set函数的参数! – jarlh

回答

2

您可能需要像这样:

select a.driver_code, p.name 
from accidents a 
    inner join p person 
    on (a.driver_code=p.code) 
where accident_date >= add_months(sysdate, -4) 
group by a.driver_code, p.name 
having count (1)>2 

这样,你只考虑过去4个月内的事故,然后计算每个用户的事故,并添加另一个条件只检索用户至少2起事故。

+0

我有一个问题,不应该是:其中a.accident_date> = add_months(sysdate,-4)并添加a.accident_date以选择;并且在条款中,1可以代替a.accident_date? – AIP

+0

不需要在'accident_date'之前添加'a.',因为你只有表'accident'中的那一列,所以你没有歧义;如果您在选择列表中添加了'accident_date',那么即使在'group by'子句中,您也必须添加它,因此每个日期都有一行,而不是每个驱动程序都有一行。在一个'count()'中,你可以使用1或者其他不为null的值来确保统计所有的行,不管字段是什么;不同的是,如果你使用'count(someField)',你将只有'someField不为空'的行数,而不是所有的行 – Aleksej

-1

我测试了微软SQL服务器上,而应该在Oracle运行不变:

create table ACCIDENTS (
    ACCIDENT_DATE DATETIME , 
    DRIVER_CODE NVARCHAR(10) , 
    DAMAGES DECIMAL, 
    LOCATION_ACCIDENT NVARCHAR(100), 
    CAR_CODE NVARCHAR(10) 
) 


create table CARS (
    CAR_CODE NVARCHAR(10), 
    MODEL NVARCHAR(10), 
    YEAR NVARCHAR(10), 
    CODE_OWNER NVARCHAR(10) 
) 

insert into cars values ('THX1138','Ford Orion','2005','J.Taylor') 
insert into cars values ('BHQ1142','Ford Ka','1980','J. Caesar') 


insert into accidents values ('2015-09-17','JT',345.0,'Warsaw','THX1138') 
insert into accidents values ('2015-09-18','JT',222.0,'Warsaw','THX1138') 
insert into accidents values ('2015-09-20','JC',444.0,'London','BHQ1142') 


with numberOfAccidents as (
    select driver_code, count(driver_code) as numberOfAccidents from accidents group by driver_code 
) 

select a.driver_code,a.accident_date 
from accidents a 
where driver_code In (select driver_code from numberOfAccidents where numberOfAccidents >= 2) 

您可以在where子句添加到与给事故在过去4个月