DEV Community

loading...

Transformando varias linhas em uma linha só

Roberto Vale
Trabalhando com o desenvolvimento de soluções completas, desde a concepção do projeto até a entrega.
・1 min read

CREATE DATABASE DB
GO

USE DB
GO

DROP TABLE IF EXISTS PESSOA
GO

CREATE TABLE PESSOA
(
COD_PESSOA INT IDENTITY PRIMARY KEY,
NOME_PESSOA VARCHAR(50),
SOBRENOME_PESSOA VARCHAR(50)
)
GO

INSERT PESSOA
VALUES ('HUGUINHO','PATO'), ('ZEZINHO','PATO'), ('LUIZINHO','PATO')
GO

CREATE TABLE TELEFONE
(
COD_TELEFONE INT IDENTITY PRIMARY KEY,
NUMERO_TELEFONE VARCHAR(25),
TIPO_TELEFONE VARCHAR(10),
COD_PESSOA INT REFERENCES PESSOA
)
GO

INSERT TELEFONE
VALUES ('1234-5678','FIXO',1), ('999999999','CELULAR',1), ('333666999','CELULAR',2), ('222444666','CELULAR',2)
GO

--NOME DE TODAS AS PESSOAS
-- SOMENTE TELEFONE CELULAR
--VAI EXISTIR NOME DUPLICADO NA LISTA
SELECT
*
FROM PESSOA P left JOIN TELEFONE T
ON P.COD_PESSOA = T.COD_PESSOA
and T.TIPO_TELEFONE = 'CELULAR'
GO

---------Exemplo antigo
SELECT
P.*,
cel1.NUMERO_TELEFONE1,
cel2.NUMERO_TELEFONE2,
FIXO1.NUMERO_TELEFONE3
FROM
PESSOA P
left join
(select
COD_PESSOA,
max(NUMERO_TELEFONE) NUMERO_TELEFONE1
from
TELEFONE T
where T.TIPO_TELEFONE = 'CELULAR'
group by COD_PESSOA)cel1
on
p.COD_PESSOA = cel1.COD_PESSOA
left join
(select
COD_PESSOA,
min(NUMERO_TELEFONE) NUMERO_TELEFONE2
from
TELEFONE T
where T.TIPO_TELEFONE = 'CELULAR'
group by COD_PESSOA)cel2
on
p.COD_PESSOA = cel2.COD_PESSOA
left join
(select
COD_PESSOA,
min(NUMERO_TELEFONE) NUMERO_TELEFONE3
from
TELEFONE T
where T.TIPO_TELEFONE = 'FIXO'
group by COD_PESSOA)FIXO1
on
p.COD_PESSOA = FIXO1.COD_PESSOA

--exemplo novo
select
*
FROM PESSOA P
cross apply
(SELECT
t.NUMERO_TELEFONE + ','
FROM TELEFONE t
where TIPO_TELEFONE = 'CELULAR'
and P.COD_PESSOA = t.COD_PESSOA
FOR XML path ('')) resultado/Nome da tabela/ (NUMERO_TELEFONE/Nome do campo/)

Discussion (0)