Array
(
)

Consulta SQL complexa

Bruno Gomes
   - 06 dez 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.

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.

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...


Vinicius2k
   - 07 dez 2005

Colega,

Algo como:
#Código

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+


Bruno Gomes
   - 07 dez 2005

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


Bruno Gomes
   - 07 dez 2005

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:

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

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.


Emerson
   - 07 dez 2005

tente assim:
#Código

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



Emerson
   - 07 dez 2005

ou, ainda mais simples:

#Código

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



Bruno Gomes
   - 07 dez 2005

Valeu, emerson.en! Obrigado mesmo...


Guima
   - 20 fev 2006

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 ???