Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde,
após dias tentando resolver a questão e depois de buscar inúmeras soluções aqui no fórum e na internet em geral acabei decidindo pedir ajuda.
Tenho que fazer uma listagem em meu banco relacionando em colunas uma informação que consigo facilmente obter em linhas.
Uso a seguinte sentença:
SELECT PPESSOA.NOME, P.NOME AS PAI, P.EMAIL AS EMAILPAI,
M.NOME AS MAE, M.EMAIL AS EMAILMAE
FROM SALUNO, SMATRICPL, SHABILITACAOFILIAL, SCURSO, SPLETIVO, SSTATUS, PPESSOA,
SPESSOA
LEFT OUTER JOIN PPESSOA P ON SPESSOA.CODPESSOAPAI = P.CODIGO
LEFT OUTER JOIN PPESSOA M ON SPESSOA.CODPESSOAMAE = M.CODIGO
WHERE
SALUNO.RA = SMATRICPL.RA AND
SALUNO.CODPESSOA = SPESSOA.CODIGO AND
SPESSOA.CODIGO = PPESSOA.CODIGO AND
SMATRICPL.IDPERLET = SPLETIVO.IDPERLET AND
SMATRICPL.CODSTATUS = SSTATUS.CODSTATUS AND
SMATRICPL.IDHABILITACAOFILIAL = SHABILITACAOFILIAL.IDHABILITACAOFILIAL and
shabilitacaofilial.codcurso = scurso.codcurso and
shabilitacaofilial.codfilial = SPLETIVO.CODFILIAL
E ela me resulta o nome do aluno, nome do pai, email do pai, nome da mãe e email da mãe.
A questão é a seguinte, caso um pai possua 2 filhos, eles saem em linhas, por exemplo:
ALAN M*** | PAULO A | A@.COM | S GONÇALVES | S***@IG.COM.BR
LUIZA M*** | PAULO A | A@.COM | S GONÇALVES | S***@IG.COM.BR
Gostaria que fosse feito um agrupamento usando algum campo em comum (nome do pai, por exemplo) e os filhos saíssem em colunas, dessa forma:
ALAN M*** | LUIZA M | PAULO A | A@.COM | S* GONÇALVES | S***@IG.COM.BR
Um dos problemas é que os pais não possuem número fixo de filhos e isso está me deixando louco sobre como poderia usar o PIVOT ou alguma outra solução para resolver.
Espero que não tenha ficado muito complicado para entender, qualquer coisa favor perguntarem, espero que alguém possa me ajudar com alguma solução. Obrigado.
Fala, Nanicesar! tranquilão?
Fiz um exemplo maroto aqui, olha se te atende... por ser dinamico vc vai precisar usar um exec() isso vai limitar a utilização de um pivot dinamico, vc não poder usar "exec" em views nem em funções....
qualquer coisa, só entrar em contato
Abraço!
use tempdb
go
-----------------------------------------------------------------------------------------------------
--Criação de uma tabela temporária
-----------------------------------------------------------------------------------------------------
if object_id('tempdb..alunos') is not null
drop table alunos
create table alunos
(
dependentes varchar(150)
,pai varchar(150)
,emaildopai varchar(150)
,nomedamae varchar(150)
,emaildamae varchar(150)
)
insert into alunos values ('alan asteriscos','paulo asteriscos','paulo.asteriscos@email.com','maria asteriscos','maria.asteriscos@email.com')
insert into alunos values ('luiza asteriscos','paulo asteriscos','paulo.asteriscos@email.com','maria asteriscos','maria.asteriscos@email.com')
insert into alunos values ('luke asteriscos','anakin asteriscos','anakin.asteriscos@email.com','padme asteriscos','padme.asteriscos@email.com')
insert into alunos values ('leia asteriscos','anakin asteriscos','anakin.asteriscos@email.com','padme asteriscos','padme.asteriscos@email.com')
insert into alunos values ('Diemerson','meu pai','meupai@email.com','minha mãe','minhamae@email.com')
insert into alunos values ('zika','aedes aegypti','aedes@email.com','"mosquita"','"mosquita"@email.com')
insert into alunos values ('dengue','aedes aegypti','aedes@email.com','"mosquita"','"mosquita"@email.com')
insert into alunos values ('chikungunya','aedes aegypti','aedes@email.com','"mosquita"','"mosquita"@email.com')
go
-----------------------------------------------------------------------------------------------------
--Pivot dinamico maluco
-----------------------------------------------------------------------------------------------------
declare @colunaspivot varchar(max)
declare @colunasfirula varchar(max)
set @colunaspivot = ''
set @colunasfirula = ''
select
@colunaspivot = @colunaspivot + '['+convert(varchar,id)+'],',
@colunasfirula = @colunasfirula + '['+convert(varchar,id)+'] as [dependente'+convert(varchar,id)+'], '
from(
select
distinct convert(varchar,rank() over (partition by pai order by dependentes)) id
from alunos
)deps
exec(
'select
'+@colunasfirula+'
pai
,emaildopai
,nomedamae
,emaildamae
from
(
select
rank() over (partition by pai order by dependentes) count
,dependentes
,pai
,emaildopai
,nomedamae
,emaildamae
from alunos
)al
pivot (max(dependentes) for count in ('+@colunaspivot+'[0])) pvt')
if object_id('tempdb..alunos') is not null
drop table alunos
Pode postar um resultado com todos os campos preenchidos e outro sem?
Vc pode usar CTE ou tabela temporaria? Existe alguma restricao?