Pour un producteur, un cru est significatif s'il a été produit en quantité supérieure à 200 litres, Calculer pour chaque producteur le nombre de crus significatifs récoltés


Solution en deux phases :
CREATE VIEW CRUSIG AS
SELECT P.NUM, P.NOM, P.PRENOM, V.CRU
FROM PRODUCTEURS P, RECOLTES R, VINS V
WHERE P.NUM=R.NPROD AND V.NUM=R.NVIN
GROUP BY P.NUM, P.NOM, P.PRENOM, V.CRU
HAVING SUM(R.QUANTITE) > 200

SELECT NOM, PRENOM, COUNT(*)
FROM CRUSIG
GROUP BY NUM, NOM, PRENOM

Solution en une requête :
Select P.NOM, P.PRENOM, Count (Distinct V.CRU)

From PRODUCTEURS P, RECOLTES R, VINS V

Where P.NUM = R.NPROD and

R.NVIN = V.NUM and

V.CRU in ( Select V1.CRU

From VINS V1, RECOLTES R1

Where R1.NPROD = P.NUM and

R1.NVIN = V1.NUM

Group By V1.CRU

Having Sum (R1.QUANTITE) > 200 )

Group By P.NUM, P.NOM, P.PRENOM

Nombre de tuples : 50 (>200) ou 52 (>=200)

Erreurs classiques

a) Oubli de la clause Distinct dans le Count => on compte aussi les doubles

b) On groupe par nom, prénom alors que la clé de PRODUCTEURS est num