Consulta SQL complexa
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...
[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
Curtidas 0
Respostas
Vinicius2k
06/12/2005
Colega,
Algo como:
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+
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+
GOSTEI 0
Bruno Gomes
06/12/2005
OK, amigo... meu BD é o Firebird, vou testar o seu código
GOSTEI 0
Bruno Gomes
06/12/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:
[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.
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.
GOSTEI 0
Emerson Nascimento
06/12/2005
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
GOSTEI 0
Emerson Nascimento
06/12/2005
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
GOSTEI 0
Bruno Gomes
06/12/2005
Valeu, emerson.en! Obrigado mesmo...
GOSTEI 0
Guima
06/12/2005
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 ???
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 ???
GOSTEI 0