DROP TABLE GIOCATORI;
DROP TABLE PUNTI;
DROP TABLE VALUTAZIONI;


CREATE TABLE GIOCATORI (
	IDG	 CHAR(4) NOT NULL PRIMARY KEY,
	NOME 	 VARCHAR(20) NOT NULL,
	COGNOME  VARCHAR(20) NOT NULL,
	DATANASCITA DATE NOT NULL,
	RUOLO	 VARCHAR(15) NOT NULL CHECK (RUOLO IN ('palleggiatore','libero','opposto','schiacciatore','centrale')) );

CREATE TABLE PUNTI (
	IDG 	 CHAR(4) NOT NULL REFERENCES GIOCATORI,
	PARTITA	 INT 	NOT NULL,
	SET 	 INT	NOT NULL CHECK (SET BETWEEN 1 AND 5),
	PUNTISET INT	CHECK (PUNTISET >= 0),
	PRIMARY KEY (IDG,PARTITA,SET)				);

CREATE TABLE VALUTAZIONI (
	IDG 	 CHAR(4)  NOT NULL REFERENCES GIOCATORI,
	PARTITA	 INT 	  NOT NULL,
	VOTO 	 DEC(4,2) NOT NULL CHECK (VOTO BETWEEN 1 AND 10),
	PRIMARY KEY (IDG,PARTITA)				);


INSERT INTO GIOCATORI VALUES
('G001','Ivan','Zaytsev','02.10.1988','opposto'),
('G002','Simone','Anzani','24.02.1992','centrale'),
('G003','Earvin','N''Gapeth','12.02.1991','opposto')
-- ('G004','Filippo','Lanza','03.03.1991','schiacciatore'),
-- ('G005','Osmany','Juantorena','12.08.1985','schiacciatore')
;

INSERT INTO PUNTI VALUES
('G001',123,1,12),
('G001',123,2,8),
('G001',123,3,NULL),
('G002',123,1,4),
('G002',123,2,NULL),
('G002',123,3,6),
('G003',123,1,7),
('G003',123,2,12),
('G003',123,3,8),

('G001',129,1,10),
('G001',129,2,12),
('G001',129,3,8),
('G001',129,4,9),
('G003',129,1,5),
('G003',129,2,6),
('G003',129,3,8),
('G003',129,4,9)
;

INSERT INTO VALUTAZIONI VALUES
('G001',123,8.5),
('G002',123,6.0),
('G003',123,8.0),
('G001',129,9.0),
('G003',129,5.0)
;


-- 2.1
WITH TOT_PUNTI (Partita, IDG) AS (
SELECT   P.Partita, P.IDG 
	FROM	   PUNTI P
	GROUP BY P.Partita, P.IDG
HAVING   SUM(P.PuntiSet) >= 20	)

SELECT 	T.Partita
FROM   	TOT_PUNTI T, VALUTAZIONI V
WHERE	(T.IDG,T.Partita) = (V.IDG,V.Partita)
AND	V.Voto > 7
GROUP BY T.Partita
HAVING	COUNT(*) >= 2;



-- 2.2
SELECT  P.Partita,P.IDG 
FROM	PUNTI P
GROUP BY P.Partita,P.IDG
HAVING  COUNT(P.PuntiSet) >=2
	EXCEPT
SELECT 	P.Partita,P.IDG 
FROM	PUNTI P
WHERE	EXISTS ( SELECT *
		 FROM   PUNTI P1
		 WHERE  (P1.Partita,P1.IDG) = (P.Partita,P.IDG) 
		 AND    P1.Set > P.Set
		 AND    P1.PuntiSet <= P.PuntiSet  	);


GRANT SELECT ON GIOCATORI TO PUBLIC;
GRANT SELECT ON PUNTI TO PUBLIC;
GRANT SELECT ON VALUTAZIONI TO PUBLIC;










