Query para mostrar Setores e um Count dos funcionarios?
18/08/2004
0
Bom, estou usando MySQL e estou com um probleminha que não estou conseguindo resolver... :´(
Eu tenho as tabelas: [b:ba34fe886c]CadFuncionario[/b:ba34fe886c] e a [b:ba34fe886c]CadSetor[/b:ba34fe886c]. Na tabela CadFuncionario tem o campo [b:ba34fe886c]SETOR[/b:ba34fe886c] que faz referencia ao campo [b:ba34fe886c]Setor_cod[/b:ba34fe886c] (chave primaria) da tabela CadSetor. Tudo isso para indicar a qual setor pertence o funcionário cadastrado.
Até aqui tudo bem... O problema vem a seguir:
Eu quero mostrar na Grid, [b:ba34fe886c]Todos[/b:ba34fe886c] os setores, e uma contagem de quantos funcionários pertencem a este setor. Mas se o setor não tem nenhum funcionário cadastrado, eu queria mostrar a contagem como retornando ZERO, mas o MySQL some com os setores que não tem nenhum funcionário.
Será que fui claro na descrição do problema? A query que eu estava fazendo era essa:
select *, count( CadFuncionario.setor ) as TotFuncionarios from CadSetor, CadFuncionario where Setor_cod = setor group by CadFuncionario.setor
Alguem tem alguma idéia de como eu deveria proceder neste caso?
Obrigado!
Nildo
Posts
18/08/2004
Vinicius2k
Eu estou sem uma base com a mesma lógica da sua para testar agora, mas *eu acho´ que o problema está no Group By... faça um teste agrupando por Cad_Setor.Setor_Cod...
Perdõe-me se não for isso :roll:
T+
Vina.
18/08/2004
Nildo
Cai na mesma... :´(
18/08/2004
Cabelo
Não consegui resolver o problema com SQL, parti para o Delphi..
Dei um Select distinct na Tabela principal(Setor), fiz um while e fui adicionando a um ClientDataSet os resultados, se o count não retornar nada (isnull), coloco zero..
:oops: (é gambiarra, mas funciona legal) :lol:
espero ter ajudado..
Cabelo
18/08/2004
Emerson Nascimento
tente assim:
select *, count( CF.Setor ) as TotFuncionarios
from CadSetor CS
    left join CadFuncionario CF on (CF.Setor = CS.Setor_Cod)
group by
    CF.Setor
acho que assim funciona.
18/08/2004
Emerson Nascimento
select *,
    (select count(Setor) from CadFuncionario where Setor=CadSetores.Setor_Cod) as TotFuncionarios
from
    CadSetores
order by
    Setor_Cod
18/08/2004
Nildo
[b:af31b14b0f]Cabelo_uni[/b:af31b14b0f] - se eu realmente não conseguir utilizando queries eu vou partir para as gambiarras :oops: afinal... o que é um programador sem gambiarras? :lol:
[b:af31b14b0f]emerson.en (primeira solução)[/b:af31b14b0f] - A tabela de setor tinham 3 registros. Sua query me retornou apenas 1 (o primeiro), e o Count me retornou 3. Mas existem uns 140 funcionários cadastrados.
[b:af31b14b0f]emerson.en (segunda solução)[/b:af31b14b0f] - Acho que o MySQL não aceita sub-select. Retorna erro perto de [i:af31b14b0f]´select count(Setor) from CadFuncionario ´[/i:af31b14b0f]
Mais alguma dica? Não quero partir para as gambiarras :oops:
18/08/2004
Rômulo Barros
...
Having count(CadFuncionario.setor) > 0
...
Segunda solução:
No Oracle, temos a function AVL que nos traz ´0(zero)´ quando um registro possui valor nulo.
:arrow: :arrow: :arrow:
18/08/2004
Rômulo Barros
SELECT S.*,(SELECT COUNT(F.SETOR) FROM FUNCIONARIOS F WHERE F.SETOR = S.SETOR)AS QTD FROM SETORES S WHERE QTD > 0
18/08/2004
Nildo
Primeiramente obrigado!
Como ficaria sua primeira solução em minha query? Estou meio perdido em como implementá-lo.
na segunda solução, o MySQL não aceita sub-selects, logo não funciona.
18/08/2004
Emerson Nascimento
[url]http://www.bitmechanic.com/mail-archives/mysql/current/2149.html[/url]
18/08/2004
Nildo
Hummm! Legal, gostei! mas...
Volto a meu problema... Se não houver nenhum funcionário para um determinado Setor, aquele meu select não vai retornar o Setor, mas eu queria que me retornasse aquele setor, com o Count sendo ZERO
18/08/2004
Emerson Nascimento
SELECT tp.pcode, IF(ISNULL(tr.pcode), 0, COUNT(*)) AS count
FROM tp
LEFT JOIN tr ON tp.pcode = tr.pcode
GROUP BY tp.pcode;
+---------+-------+
| pcode | count |
+---------+-------+
| kvw2000 | 28 |
| kvw2001 | 0 |
+---------+-------+ (as expected)
segundo o artigo, [b:3d39eb323d]seu campo Setor não pode estar indexado[/b:3d39eb323d], e o código deveria ser:
Select CS.Setor_Cod, If( IsNull(CF.Setor),0,Count(*) ) as TotFuncionarios
from CadSetores CS
left join CadFuncionarios CF on CS.Setor_Cod = CF.Setor
group by CS.Setor_Cod
18/08/2004
Nildo
Poxa, valew mesmo!!!
Muito obrigado!
Muito obrigado a você e a todos que me ajudaram!!! Valewsssss!!! :D :D :D
Clique aqui para fazer login e interagir na Comunidade :)