Query para mostrar Setores e um Count dos funcionarios? - Fórum DevMedia
Query para mostrar Setores e um Count dos funcionarios?
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:
*, count( CadFuncionario.setor ) as TotFuncionarios
CadSetor, CadFuncionario
Setor_cod = setor
CadFuncionario.setor
Alguem tem alguma idéia de como eu deveria proceder neste caso?
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:
nildo, 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.
Cai na mesma... :´(
Isto aconteceu comigo quando estava utilizando o SQL Server..
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:
o problema está na forma como foi feita a instrução. da forma que está, foi feito um INNER JOIN, que significa que só serão mostrados valores que estejam em ambas tabelas.
select *, count( CF.Setor ) as TotFuncionarios
from CadSetor CS
left join CadFuncionario CF on (CF.Setor = CS.Setor_Cod)
CF.Setor
acho que assim funciona.
se isso não der certo, tente com subselects:
(select count(Setor) from CadFuncionario where Setor=CadSetores.Setor_Cod) as TotFuncionarios
CadSetores
Setor_Cod
Postando os resultados:
[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:
Having count(CadFuncionario.setor) > 0
No Oracle, temos a function AVL que nos traz ´0(zero)´ quando um registro possui valor nulo.
SELECT S.*,(SELECT COUNT(F.SETOR) FROM FUNCIONARIOS F WHERE F.SETOR = S.SETOR)AS QTD
FROM SETORES S
WHERE QTD > 0
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.
veja se esse artigo te ajuda:
[url]http://www.bitmechanic.com/mail-archives/mysql/current/2149.html[/url]
veja se esse artigo te ajuda: [url]http://www.bitmechanic.com/mail-archives/mysql/current/2149.html[/url]
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
1. When tr.pcode is not indexed:
SELECT tp.pcode, IF(ISNULL(tr.pcode), 0, COUNT(*)) AS count
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: