DROP TABLE FURGONI;
DROP TABLE VIAGGI;
DROP TABLE SOSTE;

CREATE TABLE FURGONI (
	Targa	 CHAR(10) NOT NULL PRIMARY KEY,
	Sede	 VARCHAR(20) NOT NULL 		);

CREATE TABLE VIAGGI (
	IDV	 CHAR(6) NOT NULL PRIMARY KEY,
	Targa	 CHAR(10) NOT NULL REFERENCES FURGONI,
	Data	 DATE 	NOT NULL,
	OraPartenza TIME NOT NULL,
	OraArrivo   TIME NOT NULL,	
	KmPercorsi  INT	NOT NULL CHECK (KmPercorsi > 0),
	CHECK (OraArrivo > OraPartenza),
	UNIQUE (Targa,Data,OraPartenza)		);

CREATE TABLE SOSTE (
	IDV	  CHAR(6) NOT NULL REFERENCES VIAGGI,
	OraInizio TIME NOT NULL,
	NumMinuti INT NOT NULL CHECK (NumMinuti > 0),
	PRIMARY KEY (IDV,OraInizio)		);

INSERT INTO FURGONI VALUES
('EC123CD','Bologna'),
('EC234EF','Bologna'),
('FF412CG','Modena'),
('FB481HJ','Modena');

INSERT INTO VIAGGI VALUES
('V19012','EC123CD','27.10.2019','05:32','08:14',250),
('V19014','EC123CD','25.11.2019','06:21','15:12',832),
('V20002','EC123CD','04.01.2020','05:32','08:14',250),
('V20003','EC123CD','07.01.2020','08:15','19:02',915),

('V19017','EC234EF','25.12.2019','09:32','10:27',102),
('V19018','EC234EF','28.12.2019','12:41','19:17',615),
('V20005','EC234EF','12.01.2020','09:14','12:35',251),

('V19013','FF412CG','18.11.2019','08:45','22:18',972),
('V19016','FF412CG','20.12.2019','08:01','11:52',350),
('V20004','FF412CG','12.01.2020','08:32','12:27',412),
('V20007','FF412CG','13.01.2020','08:14','15:14',517),

('V19015','FB481HJ','05.12.2019','10:34','16:25',515),

('V20001','FB481HJ','03.01.2020','10:15','15:12',430),
('V20006','FB481HJ','12.01.2020','10:55','19:25',615)
;

INSERT INTO SOSTE VALUES
('V19012','07:15',10),
('V19014','09:23',12),
('V19014','13:10',45),
('V20003','12:15',30),
('V20003','17:20',10),

('V19018','14:42',25),
('V20005','11:17',10),

('V19013','12:10',20),
('V19013','17:23',10),
('V19013','19:40',25),
('V19016','10:05',11),
('V20007','12:15',22),

('V19015','12:50',35),
('V20001','13:15',40),
('V20006','13:10',30),
('V20006','17:15',20)
;

GRANT SELECT ON FURGONI TO PUBLIC;
GRANT SELECT ON VIAGGI TO PUBLIC;
GRANT SELECT ON SOSTE TO PUBLIC;


-- 2.1
SELECT F.Sede, DEC(AVG(S.NumMinuti*1.0),6,2) AS DURATA_MEDIA_SOSTA
FROM FURGONI F, VIAGGI V, SOSTE S
WHERE F.Targa = V.Targa
AND   V.IDV = S.IDV
AND   EXISTS (SELECT *
	      FROM   SOSTE S1
	      WHERE  S1.IDV = V.IDV
	      AND    S1.NumMinuti >= 15 )
GROUP BY F.Sede;



-- 2.2
WITH 
TOT_DURATA_SOSTE (Anno,Targa,IDV,DurataViaggio,TotMinuti) AS (
	SELECT   YEAR(V.Data), V.Targa, S.IDV, HOUR(V.OraArrivo-V.OraPartenza)*60+MINUTE(V.OraArrivo-V.OraPartenza),
		 SUM(S.NumMinuti)
	FROM	 VIAGGI V, SOSTE S
	WHERE	 V.IDV = S.IDV
	GROUP BY YEAR(V.Data), V.Targa, S.IDV, V.OraArrivo-V.OraPartenza
	)
SELECT 	T.Anno, T.Targa, T.IDV
FROM 	TOT_DURATA_SOSTE T
WHERE	T.TotMinuti*1.0/T.DurataViaggio = 
	(	SELECT	MAX(T1.TotMinuti*1.0/T1.DurataViaggio)
		FROM	TOT_DURATA_SOSTE T1
		WHERE	T1.Anno = T.Anno);




