En tu ejemplo estás comparando el valor de
EC.CodigoEquipoComputo, no con los códigos, sino con la
suma del valor de los códigos que cumplen con la condición indicada.
Eso no tiene sentido.
Prueba:
Código sql:
Ver originalSELECT
P.CodigoPrograma,P.Descripcion `Programa`,
COUNT(EC.CodigoEquipoComputo) `PCS`,
SUM(PI.FlagTieneLicencia) AS `Pcs con licencia`
FROM
EquipoComputo EC
INNER JOIN ProgramasInstalados PI USING(CodigoEquipoComputo)
INNER JOIN Programas p USING(CodigoPrograma)
WHERE
(YEAR(EC.FechaAdquisicion) BETWEEN 2000 AND 2002) AND
NOT (EC.CodigoEquipoComputo IN (SELECT
PM.CodigoEquipoComputo
FROM
EquipoComputo EC
INNER JOIN PlanMantenimiento PM USING(CodigoEquipoComputo)
WHERE
(YEAR(EC.FechaRevision)=2001)
GROUP BY (PM.CodigoEquipoComputo)
HAVING SUM(PM.CodigoEquipoComputo)>2
)
GROUP BY P.Descripcion;
Simplifiqué un poco el código y le puse la relación donde tiene que ir (en el INNER JOIN y no en el WHERE).
Por lo demás, estoy de acuerdo con Serser.