我不会选择funcionario.name WHERE COUNT()> AVG()GROUP BY funcionario
funcionario =员工
cliente = client
SELECT funcionario.nome
FROM cliente
INNER JOIN funcionario ON cliente.nr_funcionario = funcionario.nr_funcionario
WHERE
((SELECT COUNT(*)
FROM cliente
INNER JOIN funcionario ON cliente.nr_funcionario = funcionario.nr_funcionario
GROUP BY funcionario.nome) >
(SELECT AVG(total)
FROM
(SELECT COUNT(*) AS total
FROM cliente
INNER JOIN funcionario ON cliente.nr_funcionario = funcionario.nr_funcionario
GROUP BY funcionario.nome)))
GROUP BY funcionario.nome
答案 0 :(得分:1)
我感到您对如何在查询中的给定组上设置约束感到困惑。 HAVING
关键字用于此目的,可以被视为执行WHERE
子句对单个记录执行的操作,不同之处在于它作用于记录的组。但是,使用公用表表达式,我们可以大大简化查询到以下内容:
WITH cte AS (
SELECT f.nome, COUNT(*) AS total
FROM cliente c
INNER JOIN funcionario
ON c.nr_funcionario = f.nr_funcionario
GROUP BY f.nome
)
SELECT t.nome
FROM cte t
WHERE t.total > (SELECT AVG(total) FROM cte)
答案 1 :(得分:1)
因为我没有实际的表来测试, 但是使用以下概念你肯定会得到正确的结果
declare @average int;
SELECT @average= AVG(count (*))
FROM
FROM cliente
INNER JOIN funcionario ON cliente.nr_funcionario = funcionario.nr_funcionario
GROUP BY funcionario.nome
SELECT funcionario.nome
FROM cliente
INNER JOIN funcionario ON cliente.nr_funcionario = funcionario.nr_funcionario
GROUP BY funcionario.nome
having count(functionario.nome)>@average
答案 2 :(得分:1)
我认为最好的方法是使用窗口函数:
select nome
from (select f.nome, count(*) AS total,
avg(count(*) * 1.0) over () as avg_total
from cliente c join
funcionario f
on c.nr_funcionario = f.nr_funcionario
group by f.nome
) fc
where total > avg_total;
这应该比不止一次引用CTE的版本具有更好的性能。