quinta-feira, 1 de agosto de 2013

Converter várias linhas em uma única linha no SQL Server

Como converter várias linhas em uma única linha no SQL Server, separando por ponto e virgula ";".


USE tempdb;
-- DROP TABLE pessoa_fisica;
CREATE TABLE pessoa_fisica 
(
   id_pessoa_fisica int IDENTITY (1,1) PRIMARY KEY 
 , nome             varchar(100)       NOT NULL 
 , sexo             varchar(1)         NOT NULL 
); 

-- DROP TABLE email;
CREATE TABLE email 
(
   id_email         int IDENTITY (1,1) PRIMARY KEY 
 , email            varchar(100)       NOT NULL 
 , id_pessoa_fisica int                NOT NULL REFERENCES pessoa_fisica(id_pessoa_fisica) 
);  


-- inserindo na tabela pessoa_fisica
INSERT INTO pessoa_fisica (nome, sexo) VALUES ('Maria','F'); 
INSERT INTO pessoa_fisica (nome, sexo) VALUES ('Ieda','F'); 
INSERT INTO pessoa_fisica (nome, sexo) VALUES ('Ilma','F'); 
INSERT INTO pessoa_fisica (nome, sexo) VALUES ('Felipe','F'); 

-- listando todas as pessoas fisicas cadastradas 
SELECT * FROM pessoa_fisica;

-- inserindo na tabela email 

-- inserindo emails de Maria
INSERT INTO email (email, id_pessoa_fisica) VALUES ('maria@exemplo.com', 1); 
INSERT INTO email (email, id_pessoa_fisica) VALUES ('maria.rosa@exemplo.com', 1); 
INSERT INTO email (email, id_pessoa_fisica) VALUES ('maria.silva@exemplo.com', 1); 

-- inserindo emails de Ieda
INSERT INTO email (email, id_pessoa_fisica) VALUES ('ieda@exemplo.com', 2); 
INSERT INTO email (email, id_pessoa_fisica) VALUES ('ieda.lima@exemplo.com', 2); 


-- inserindo emails de Felipe 
INSERT INTO email (email, id_pessoa_fisica) VALUES ('felipe@exemplo.com', 4); 
INSERT INTO email (email, id_pessoa_fisica) VALUES ('felipe.santos@exemplo.com', 4); 

-- listando todos os emails cadastrados
SELECT * FROM email;

-- listando emails de Maria 

-- listando emails de Maria em várias linhas 
-- exemplo 1.1

SELECT email + '; ' FROM email WHERE id_pessoa_fisica = 1;

-- listando emails de Maria em uma única linha 
-- exemplo 1.2  

SELECT stuff( (SELECT email + '; ' FROM email WHERE id_pessoa_fisica = 1  FOR XML PATH('')),1,0,'');

-- listando todos os emails cadastrados com todas as pessoas cadastradas, 
--  considerando vários emails em uma unica linha.
-- exemplo 2

SELECT pessoa_fisica.nome
     , stuff ( 
               (
                 SELECT email.email + '; ' 
                   FROM email 
                  WHERE email.id_pessoa_fisica = pessoa_fisica.id_pessoa_fisica  
                    FOR XML PATH('')
               ),1,0,''
             ) AS emails
  FROM pessoa_fisica
     ;



Mais uma vez espero ter ajudado ...

2 comentários: