Consulta SQL complexa

06/12/2005

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

Respostas

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 Citar

07/12/2005

Bruno Gomes

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


Responder Citar

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 Citar

07/12/2005

Emerson

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 Citar

07/12/2005

Emerson

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 Citar

07/12/2005

Bruno Gomes

Valeu, emerson.en! Obrigado mesmo...


Responder Citar

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 Citar