2016-05-12 62 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個月