Consulta SQL complexa

06/12/2005

0

Olá pessoal... será que alguém pode me ajudar em uma consulta SQL que estou querendo montar? É os seguinte: tenho uma tabela de contatos com o nome, telefone e tipo de telefone. O tipo de telefone pode ter o valor ´0´, para telefone residencial, ´1´ para telefone comercial, ou ´2´ para telefone celular.

[b:74f5a1395a]A tabela de contatos pode ter mais de um registro com o mesmo nome. Por exemplo, o nome EDUARDO pode ter 5 telefones (1 residencial, 2 comerciais e 2 celulares), sendo cada um desses 5 telefones um registro.[/b:74f5a1395a]

A consulta que preciso fazer é a seguinte: na mesma linha da grid devem aparecer o nome do contato e quantidade de telefones residenciais, comerciais e celular que ele tem. No caso do EDUARDO apareceria o nome dele, na coluna ´nome´, 1 na coluna ´telefones residenciais´, 2 na coluna ´telefones comerciais´ e 2 na coluna ´telefones celular´.

Será que é possível? Ficaria muito agradecido se alguém me ajudar...


Bruno Gomes

Bruno Gomes

Responder

Posts

07/12/2005

Vinicius2k

Colega,

Algo como:
select
  ID,
  NOME,
  (select count(ID) from CONTATOS where TIPO = ´0´) as QTDE_TEL_RESIDENCIAIS,
  (select count(ID) from CONTATOS where TIPO = ´1´) as QTDE_TEL_COMERCIAIS,
  (select count(ID) from CONTATOS where TIPO = ´3´) as QTDE_TEL_CELULARES
from
  SUA_TABELA
where
...


Isto desde que o seu BD/ SGBD suporte ´subselects´. Além disto, a tendência é que esta seja uma consulta um tanto quanto demorada, dependendo do volume de dados na tabela ´CONTATOS´.

T+


Responder

07/12/2005

Bruno Gomes

OK, amigo... meu BD é o Firebird, vou testar o seu código


Responder

07/12/2005

Bruno Gomes

Consegui apenas parte do meu objetivo com esta consulta.

Por exemplo, para mostrar a qtde de telefones do EDUARDO eu preciso fazer o seguinte select:

[color=darkblue:4b07e83402]select
CODIGO,
NOME,
(select count(ID) from CONTATOS where TIPO = ´0´ and CODIGO = 5) as QTDE_TEL_RESIDENCIAIS,
(select count(ID) from CONTATOS where TIPO = ´1´ and CODIGO = 5) as QTDE_TEL_COMERCIAIS,
(select count(ID) from CONTATOS where TIPO = ´3´ and CODIGO = 5) as QTDE_TEL_CELULARES
from
CONTATOS
where
CODIGO = 5
group by
CODIGO[/color:4b07e83402]

Essa consulta me lista somente os registros do nome EDUARDO. Eu necessito fazer a consulta para exibir TODOS os nomes da tabela, pela ordem de telefones comerciais.


Responder

07/12/2005

Emerson Nascimento

tente assim:
select 
  con1.CODIGO, 
  con1.NOME, 
  (select count(con2.ID) from CONTATOS con2
   where con2.TIPO = ´0´ 
     and con2.CODIGO = con1.CODIGO) as QTDE_TEL_RESIDENCIAIS, 
  (select count(con2.ID) from CONTATOS con2
   where con2.TIPO = ´1´ 
     and con2.CODIGO = con1.CODIGO) as QTDE_TEL_COMERCIAIS, 
  (select count(con2.ID) from CONTATOS con2
   where con2.TIPO = ´3´ 
     and con2.CODIGO = con1.CODIGO) as QTDE_TEL_CELULARES 
from 
  CONTATOS con1
group by 
  con1.CODIGO



Responder

07/12/2005

Emerson Nascimento

ou, ainda mais simples:

select
  CODIGO,
  NOME,
  sum( case when TIPO=´0´ then 1 else 0 end) QTDE_TEL_RESIDENCIAIS,
  sum( case when TIPO=´1´ then 1 else 0 end) QTDE_TEL_COMERCIAIS,
  sum( case when TIPO=´3´ then 1 else 0 end) QTDE_TEL_CELULARES
from 
  CONTATOS
group by 
  CODIGO, NOME



Responder

07/12/2005

Bruno Gomes

Valeu, emerson.en! Obrigado mesmo...


Responder

20/02/2006

Guima

select
DISTINCT COD_PRODUTO,
QTDE,
sum( case when TIPO=´ENTRADA´ then sum(qtde) else 0 end) ENT,
sum( case when TIPO=´CONSUMO´ then sum(qtde) else 0 end) CON
from
MOVIMENTO_ESTOQUE
group by
COD_PRODUTO, QTDE

eu precisava somar as entradas - consumo - tem como desse jeito ???


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar