DROP TABLE GIOCATORI;
DROP TABLE PUNTI;

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)				);


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,7),
('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,5),
('G003',129,3,2),
('G003',129,4,6)
;

-- 2.1
SELECT 	G.IDG, G.Nome, G.Cognome, 
      CAST(COUNT(PuntiSet) AS DEC(6,2))/COUNT(DISTINCT Partita) 
AS MEDIA_SET_GIOCATI
FROM   	GIOCATORI G, PUNTI P
WHERE	G.IDG = P.IDG
GROUP BY G.IDG,G.Nome,G.Cognome;



-- 2.2
WITH 
PUNTI_PARTITA (Partita, IDG, TotPunti) AS (
SELECT   P.Partita,P.IDG,SUM(P.PuntiSet) 
	FROM	 PUNTI P
	GROUP BY P.Partita, P.IDG 		),

DIFF_PUNTI (Partita,Diff) AS (
	SELECT   P.Partita, MAX(TotPunti)-MIN(TotPunti) 
	FROM	 PUNTI_PARTITA P
	GROUP BY P.Partita	)

SELECT 	D1.*
FROM	DIFF_PUNTI D1
WHERE	D1.Diff = ( SELECT MAX(D2.Diff)
		    FROM   DIFF_PUNTI D2 );


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

