|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Ter Ago 27, 2019 11:48 am Assunto: |
|
|
faz um join nas tabelas _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Ago 27, 2019 8:50 pm Assunto: |
|
|
Boa noite,
Talvez a função de agregação List do Firebird possa ser útil no seu caso:
Código: | select
ct.IdContato,
ct.Nome,
list(cm.Descricao, ';') as Descricao
from Contato as ct
inner join Comunicaocao as cm
on cm.IdContato = ct.IdContato
group by
ct.IdContato,
ct.Nome |
Dessa forma os valores do campo Descricao vão retornar separados por ';' dentro do mesmo campo. Depois você pode pegar esse campo e separar os valores para gerar a planilha ou talvez gerar um arquivo do tipo csv e deixar com que a importação no Excel faça a separação dos valores.
Espero que ajude
Editado pela última vez por imex em Ter Mar 07, 2023 5:53 pm, num total de 1 vez |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Ago 28, 2019 9:44 am Assunto: |
|
|
Então Imex, ao executar da forma que estou querendo gera duplicidade dos campos na list
Veja só o select
Código: |
select
ct.IdContato,
ct.Nome,
list(cp.numerobeneficio, ';') as NumeroBeneficio,
list(cp.valorbeneficio, ';') as ValorBeneficio,
list(cm.valor, ';') as DescricaoTelefone
from Contato as ct
/* Incluir listas */
left join complementar as cp
on cp.contato_idcontato = ct.idcontato
left join Comunicacao as cm
on cm.contato_idcontato = ct.IdContato
group by
ct.IdContato,
ct.Nome
order by
NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc
|
Olhe a imagem duplicando as listas
Isso devido ao fato de estar usando mais de uma tabela no join
Tabela complementar
Tabela comunicacao
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Ago 28, 2019 11:06 am Assunto: |
|
|
Acho que isso está ocorrendo porque são 2 Joins de 1:N.
Como só está sendo utilizado um campo da tabela Comunicacao, acho que uma alternativa seria utilizar uma subquery:
Código: | select
ct.IdContato,
ct.Nome,
list(cp.numerobeneficio, ';') as NumeroBeneficio,
list(cp.valorbeneficio, ';') as ValorBeneficio,
(select list(cm.valor, ';') from Comunicacao as cm
where cm.contato_idcontato = ct.IdContato) as DescricaoTelefone
from Contato as ct
/* Incluir listas */
left join complementar as cp
on cp.contato_idcontato = ct.idcontato
group by
ct.IdContato,
ct.Nome
order by
NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc |
Espero que ajude |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Ago 28, 2019 1:34 pm Assunto: |
|
|
Se eu tiver mais outras tabelas vou ter que ficar fazendo subselects?
Exemplo assim funcionou
Código: | select
ct.IdContato||';' as idcontato,
ct.Nome||';' as nome,
--list(trim(cm.valor), ';')||';' as DescricaoTelefone,
(select list(cm.valor, ';')||';'
from Comunicacao as cm
where cm.contato_idcontato = ct.IdContato
and cm.valor <> '') as DescricaoTelefone,
/*
( select
list(trim(cp.numerobeneficio), ';'),
list(trim(cp.valorbeneficio), ';')||';'
from complementar cp
where cp.contato_idcontato = ct.IdContato) as Complementos
*/
( select
list(trim(cp.numerobeneficio), ';')||';'
from complementar cp
where cp.contato_idcontato = ct.IdContato
and cp.numerobeneficio > 0) as numerobeneficio,
( select
list(trim(cp.valorbeneficio), ';')||';'
from complementar cp
where cp.contato_idcontato = ct.IdContato
and cp.valorbeneficio > 0) as valorbeneficio,
list(trim(em.contrato), ';')||';' as Contrato,
list(trim(em.valor), ';')||';' as Valor
from Contato as ct
left join emprestimo em on em.contato_idcontato = ct.IdContato
--- só pra teste o where
-- where ct.idcontato = 443680
group by
ct.IdContato,
ct.Nome
order by
DescricaoTelefone desc
|
Porém minha duvida aqui é se eu tiver 10 campos nesta tabela terei que fazer 10 subselects?
Código: | ( select
list(trim(cp.numerobeneficio), ';')||';'
from complementar cp
where cp.contato_idcontato = ct.IdContato
and cp.numerobeneficio > 0) as numerobeneficio,
( select
list(trim(cp.valorbeneficio), ';')||';'
from complementar cp
where cp.contato_idcontato = ct.IdContato
and cp.valorbeneficio > 0) as valorbeneficio, |
Esta concat ai é só pra ver se mando csv, ainda ta em teste. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Ago 28, 2019 2:24 pm Assunto: |
|
|
Acho que uma alternativa para quando for mais de um campo é utilizar uma CTE para fazer o Join separadamente. Segue um exemplo considerando a query inicial:
Código: | with
CTE_CP as
(
select
ct.IdContato,
ct.Nome,
list(cp.numerobeneficio, ';') as NumeroBeneficio,
list(cp.valorbeneficio, ';') as ValorBeneficio,
from Contato as ct
left join complementar as cp
on cp.contato_idcontato = ct.idcontato
group by
ct.IdContato,
ct.Nome
),
CTE_CM as
(
select
ct.*,
list(cm.valor, ';') as DescricaoTelefone
from CTE_CP as ct
left join Comunicacao as cm
on cm.contato_idcontato = ct.IdContato
group by
ct.IdContato,
ct.Nome
)
select
*
from CTE_CM
order by
NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc |
A segunda CTE do exemplo acima não seria necessária pois o Join poderia ser feito no último Select, fora a opção da subquery, mas deixei dessa forma para demonstrar como ficaria a estrutura no caso de ter Join com várias tabelas diferentes.
Espero que ajude |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Ago 28, 2019 3:22 pm Assunto: |
|
|
imex escreveu: | Acho que uma alternativa para quando for mais de um campo é utilizar uma CTE para fazer o Join separadamente. Segue um exemplo considerando a query inicial:
Código: | with
CTE_CP as
(
select
ct.IdContato,
ct.Nome,
list(cp.numerobeneficio, ';') as NumeroBeneficio,
list(cp.valorbeneficio, ';') as ValorBeneficio,
from Contato as ct
left join complementar as cp
on cp.contato_idcontato = ct.idcontato
group by
ct.IdContato,
ct.Nome
),
CTE_CM as
(
select
ct.*,
list(cm.valor, ';') as DescricaoTelefone
from CTE_CP as ct
left join Comunicacao as cm
on cm.contato_idcontato = ct.IdContato
group by
ct.IdContato,
ct.Nome
)
select
*
from CTE_CM
order by
NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc |
A segunda CTE do exemplo acima não seria necessária pois o Join poderia ser feito no último Select, fora a opção da subquery, mas deixei dessa forma para demonstrar como ficaria a estrutura no caso de ter Join com várias tabelas diferentes.
Espero que ajude | Olá Imex, não entendi este sleect porque o mesmo não executa.
Ta com erro de sintaxe, ai arrumei este group by
Código: | select
ct.*,
list(cm.valor, ';') as DescricaoTelefone
from CTE_CP as ct
left join Comunicacao as cm
on cm.contato_idcontato = ct.IdContato
group by
ct.IdContato,
ct.Nome |
Mais ai não pega o outro select
from CTE_CP _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Ago 28, 2019 4:27 pm Assunto: |
|
|
A query ficou dessa forma?
Código: | with
CTE_CP as
(
select
ct.IdContato,
ct.Nome,
list(cp.numerobeneficio, ';') as NumeroBeneficio,
list(cp.valorbeneficio, ';') as ValorBeneficio,
from Contato as ct
left join complementar as cp
on cp.contato_idcontato = ct.idcontato
group by
ct.IdContato,
ct.Nome
),
CTE_CM as
(
select
ct.*,
list(cm.valor, ';') as DescricaoTelefone
from CTE_CP as ct
left join Comunicacao as cm
on cm.contato_idcontato = ct.IdContato
group by
ct.IdContato,
ct.Nome,
ct.NumeroBeneficio,
ct.ValorBeneficio
)
select
*
from CTE_CM
order by
NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc |
Qual mensagem de erro é exibida? E em qual linha? |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Ago 28, 2019 4:45 pm Assunto: |
|
|
imex escreveu: | A query ficou dessa forma?
Código: | with
CTE_CP as
(
select
ct.IdContato,
ct.Nome,
list(cp.numerobeneficio, ';') as NumeroBeneficio,
list(cp.valorbeneficio, ';') as ValorBeneficio,
from Contato as ct
left join complementar as cp
on cp.contato_idcontato = ct.idcontato
group by
ct.IdContato,
ct.Nome
),
CTE_CM as
(
select
ct.*,
list(cm.valor, ';') as DescricaoTelefone
from CTE_CP as ct
left join Comunicacao as cm
on cm.contato_idcontato = ct.IdContato
group by
ct.IdContato,
ct.Nome,
ct.NumeroBeneficio,
ct.ValorBeneficio
)
select
*
from CTE_CM
order by
NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc |
Qual mensagem de erro é exibida? E em qual linha? |
Opa, assim deu certo Imex.
Somente precisou retirar a virgula final aqui
Código: | list(cp.valorbeneficio, ';') as ValorBeneficio, |
Obrigado. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|