Ir ao conteúdo
  • Cadastre-se

Ajuda com select com inner join


Ir à solução Resolvido por SuellenOl,

Posts recomendados

Boa tarde!

Preciso de ajuda com a seguinte consulta:

SELECT sd_chamados.setor as setor, sd_setores.nome_setor,  COUNT(sd_chamados.idChamado) as qtd FROM sd_chamados inner join sd_setores on (sd_chamados.setor = sd_setores.cod_setor)WHERE sd_chamados.idSolicitante = 901 and sd_chamados.status<>'CL' and sd_chamados.status<> 'AB' and sd_chamados.status<>'AR' and sd_chamados.status<> 'RD' and sd_chamados.dtChamado >='2014-07-10' group by setor 

A consulta em si está correta, porém, preciso que a mesma me retorne o nome dos setores mesmo que não hajam chamados do solicitante para o mesmo, ou seja, quando a 'qtd' for = NULL.

Já tentei left join, right join mas também não deu..

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O JOIN que você precisa é o LEFT, pois você precisa de todos os dados da tabela A mesmo que não tenham ligação com a B. Como faz um tempinho que eu não trabalho com MySQL (que acredito que você está usando), fiz o seguinte usando MSSQL2k8, mas deve te ajudar:

 

http://sqlfiddle.com/#!3/05594/4

 

Existem até jeitos melhores para se fazer acredito eu, ou pelo menos mais limpos.. mas de qualquer forma acho que você vai conseguir migrar para o MySQL..

 

Para entender a diferença entre os joins, veja a imagem anexo.

 

Fonte da imagem: http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

PS1: Recomendo sempre escrever a linguagem SQL em si em maíusculo (você meio que já escreve, mas falta para o "and", "group by", etc..

PS2: Não sendo o chatão de novo, recomendo que idente seu código SQL sempre.. se possível, dê uma rapida lida no wikipedia sobre CamelCase. Onde tabelas seriam UpperCamelCase e campos lowerCamelCase.. Eu sei que em sistemas prontos não tem como mexer mas fica de conhecimento :)

 

Exemplo da sua query bem mais legível:

SELECT    sd_chamados.setor AS setor,    sd_setores.nome_setor,    COUNT(sd_chamados.idChamado) AS qtdFROM    sd_chamados    INNER JOIN sd_setores ON (sd_chamados.setor = sd_setores.cod_setor)WHERE    sd_chamados.idSolicitante = 901    AND sd_chamados.status <> 'CL'    AND sd_chamados.status <> 'AB'    AND sd_chamados.status <> 'AR'    AND sd_chamados.status <> 'RD'    AND sd_chamados.dtChamado >= '2014-07-10'GROUP BY setor

Abraços!

post-464300-0-58654900-1410896496_thumb.

Link para o comentário
Compartilhar em outros sites

  • Solução

Olha só, você me ajudando novamente!

Nesse meio tempo desisti do 'inner/left/right join' e usei um select dentro de outro, que funcionou mas pode ser que não seja tão otimizado quanto o teu. De qualquer forma deixarei ele aqui também!

SELECTcod_setor as vcod,nome_setor,(SELECT count(idChamado)FROMsd_chamadosWHEREsd_chamados.setor=vcod and sd_chamados.dtChamado >= '$data_inicial'AND sd_chamados.idSolicitante = '$cod_filial' AND sd_chamados.status <> 'AB' AND sd_chamados.status<>'AR' AND sd_chamados.status<>'RD' AND sd_chamados.status<>'CL') as qtdchamadosFROMsd_setores WHERE cod_setor <28 ORDER BY qtdchamados DESC

Segui sua dica e tentei identar um pouco o código. Qual ao CamelCase o ponto é realmente esse que tu falastes...

 

Grata pela ajuda novamente!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...