SELECT funcionario.name WHERE COUNT()> AVG()GROUP BY funcionario

时间:2017-03-26 02:19:31

标签: sql sql-server

我不会选择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

3 个答案:

答案 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的版本具有更好的性能。