DEV Community

Roberto Vale
Roberto Vale

Posted on

Transformando varias linhas em uma linha só

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/)

Top comments (0)