Concatenação

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Sex, 01 Fev 2008 9:24 am

E ai Galera!

to com um problema, não sei se da pra fazer isso numa query mas o problema é o seguinte... estou montando uma query para pegar os dados de um médico, a tabela é PRESTADOR... então na query eu seleciono nome, idade, endereco, etc, etc e especialidade. Porém, 1 médico pode ter N especialidades ... para fazer essa relação e pegar a descrição da especialidade tem a tabela ESP_MED onde tem o codigo do prestador e codigo da especialidade... e na tabela ESPECIALIDADE onde tem a descrição.

Rodando a query com esses relacionamentos, a quantidade de registros que vai retornar serã igual a quantidade de especialidades.... porém preciso que retorne apenas 1 registro por médico...

Tem como fazer algo do tipo concatenar para aparecer todas as especialidades na mesma linha separadas por vírgula por exemplo ???

Valeu!!
renan_pre
Localização: São Paulo - SP

M. Renan

Mensagemem Sex, 01 Fev 2008 10:28 am

Amigo,

Quando precisei disso, fiz atravez de PL-SQL , joguei os valores para uma variável (usando cursor), e depois a selecionei na consulta.
cron_rj
Localização: Rio de Janeiro RJ

Mensagemem Sex, 01 Fev 2008 10:32 am

Então brother...

Eu não estou desenvolvendo em forms... e nem reports... É uma ferramenta para desenvolvimento de relatorios que não permite pl/sql... ela trabalha com views...

Será que tem outra forma de fazer??

Abraço
renan_pre
Localização: São Paulo - SP

M. Renan

Mensagemem Sex, 01 Fev 2008 10:45 am

E ai Renan beleza??

da pra fazer sim, procure aqui no site ou na net pela palavra "PIVOT TABLE".
nesse link tem um artigo falando sobre isso..

[]'s!!
Tineks
Localização: Araraquara - SP

Cristiano (Tineks)
Araraquara - SP

Mensagemem Sex, 01 Fev 2008 10:56 am

Valeu Cristiano!

Não testei ainda mas pelo exemplo que tem no link que você mandou vai resolver meu problema!

Abraço!
renan_pre
Localização: São Paulo - SP

M. Renan

Mensagemem Sex, 01 Fev 2008 1:24 pm

Achei uma forma de fazer também , aqui deu certo. Segue o link:

http://www.oracle.com/technology/oramag/code/tips2006/101606.html
cron_rj
Localização: Rio de Janeiro RJ

Mensagemem Qui, 07 Fev 2008 9:12 am

Show de bola.
Vou colocar aqui o texto pra não perdermos essa dica:

Código: Selecionar todos
Tip of the Week
Tip for Week of October 16, 2006

Concatenate Multiple Column Records

This tip comes from Galina Petrenko, a Sr. Programmer Analyst at Harte-Hanks Inc. in Langhorne, PA.

In Oracle9i Database and later, it's possible to rotate the vertical presentation of data into horizontal presentation. The following demonstrates a simple way (without XML parsers or PL/SQL stored structures) to convert vertical presentation into horizontal presentation; it will concatenate multiple column records into a single string.

-- Temporary Data

create table TMP_TEST ( ID NUMBER, NumVal NUMBER, STRVAL VARCHAR2(32) );

insert into TMP_TEST values(1, 100, 'Hello');
insert into TMP_TEST values(1,-100, 'World');
insert into TMP_TEST values(2, 1, 'Concatenate');
insert into TMP_TEST values(2, 2, 'In String');
insert into TMP_TEST values(2, 3, 'using Connect By');
insert into TMP_TEST values(2, 4, 'Using SYS_CONNECT_BY_PATH');

commit;

-- Check Vertical Data Presentation

select * from TMP_TEST;

ID         NUMVAL     STRVAL
---------- ---------- --------------------------------
1          100        Hello
1          -100       World
2          1          Concatenate
2          2          In String
2          3          using Connect By
2          4          Using SYS_CONNECT_BY_PATH

6 rows selected.

-- Get Concatenated String with Specific Delimiter

def Delimiter=" "

SELECT
ID,
SUBSTR(MAX(REPLACE(
SYS_CONNECT_BY_PATH(STRVAL, '/')
,'/','&Delimiter')),2) Concatenated_String
FROM (
select A.*,
row_number() OVER (Partition by ID order by ID) ROW#
from TMP_TEST A)
START WITH ROW#=1
CONNECT BY PRIOR ID=ID AND PRIOR row# = row# -1
GROUP BY ID
;

ID          CONCATENATED_STRING
----------  -----------------------------------------------------------------
1           Hello World
2           Concatenate In String using Connect By Using SYS_CONNECT_BY_PATH

-- More Generic:

def Column_Sort_Name=ID
def Column_Name=NumVal
def Delimiter="|"

SELECT
ID,
SUBSTR(MAX(REPLACE(
SYS_CONNECT_BY_PATH( &Column_Name , '/')
,'/','&Delimiter')),2) Concatenated_String
FROM (
select
A.*,
row_number() OVER (Partition by ID order by &Column_Sort_Name ) ROW#
from TMP_TEST A)
START WITH ROW#=1
CONNECT BY PRIOR &Column_Sort_Name = &Column_Sort_Name
AND PRIOR row# = row# -1
GROUP BY &Column_Sort_Name
;


ID          CONCATENATED_STRING
----------  -----------------------------------------------------------------
1           100|-100
2           1|2|3|4



def Delimiter=","


ID          CONCATENATED_STRING
----------  -----------------------------------------------------------------
1           100,-100
2           1,2,3,4


dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Ter, 12 Fev 2008 4:23 pm

Pessoal, desculpa a minha ignorancia, mais alguém poderia me explicar o que fáz essa linha ?

Código: Selecionar todos
row_number() OVER (Partition by ID order by &Column_Sort_Name )


mais precisamente, o que é essa row_number(), o que é esse OVER e o que diabos faiz esse Partition =D

se alguém puder me ajudar =D

grato...
gokden
Localização: Ribeirão Preto - SP

Lucas de Souza

OCA Developer
Analista de sistemas



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes