- Este tópico contém 8 respostas, 5 vozes e foi atualizado pela última vez 13 anos, 5 meses atrás por drigo.
-
AutorPosts
-
5 de maio de 2011 às 8:09 am #99093drigoParticipante
Olaa,
Sou iniciante em PL/SQL, possuo uma tabela denominada usuario, como mostrado abaixo:
codProcesso – Nome – CPF – valor
1- Mario – 123456789 – 123
1 – Pedro – 324234233 – 9873
1 – João – 234234242 – 2423
2 – Doralice – 343434343 – 65546
2 – Marco – 457657556 – 22222
3 – Meire – 546456546 – 44444Existe a possibilidade de realizar um SELECT para que os dados sejam mostrados como na forma abaixo ???
codProcesso – Nome – CPF – Valor
1 Mario,Pedro,João 123456789,… 123,9873,2423…
2 Doralice Marco 343434343,… 65546,22222
3 Meire 546456546 44444Desde Já, Agradeço.
5 de maio de 2011 às 3:17 pm #99096leandrolbsParticipantenão entendi, vc quer 3 linhas na mesma linha?
5 de maio de 2011 às 4:59 pm #99097drigoParticipantePrezado leandrolbs,
Inicialmente obrigado pela atenção, vou tentar ser mais claro.Eu mostrei acima uma tabela, onde possui varios atributos como: codProcesso, Nome, CPF e valor. só que eu posso ter vários Nomes de pessoas ligadas ao mesmo processo, como no exemplo abaixo:
codProcesso – Nome —- CPF ————— Valor
1————– Mario —- 123456789 ——- 123
1 ————– Pedro —- 324234233 ——- 9873
1 ————– João —- 234234242 ——- 2423
2 ————– Doralice –343434343 ——- 65546
2 ————– Marco —- 457657556 —— 22222Minha intenção é : Gerar um select que coloque na mesma linha os nomes que possuem o mesmo codProcesso, conforme mostrado abaixo:
codProcesso———–Nome ——————Valor
1———————– Mario,Pedro,João——123, 9873,2423
2————————Doralice,Marco———65546,22222Ou seja, se tiver o mesmo codProcesso eu tenho que gerar uma linha com todos os Nomes e outra com todos os valores daquelas pessoas ligadas ao mesmo codProcesso.
Desde Já, Agradeço.
5 de maio de 2011 às 5:54 pm #99098leandrolbsParticipanteneste caso é necessário usar uma procedure ou function via sql padrão eu não tenho conhecimento;
mas se for via bloco, faça um loop (for), e vai concatenando a string.
5 de maio de 2011 às 10:41 pm #99100rmanParticipanteOnde isso vai ser empregado ?
Se for o caso de um relatorio, é mais simples fazer esse agrupamento no relatorio do que tentar fazer isso no SELECT…
6 de maio de 2011 às 3:29 pm #99102felipegParticipanteBom dia
Cara, segue um exemplo, coisa simples.
Se quiser utilizar, alterar ou jogar fora (risos) sinta-se a vontade.CREATE TABLE teste2(cod NUMBER, nome VARCHAR2(100),valor NUMBER)
/
INSERT INTO teste2 VALUES(1,’aaaaa’, 1234)
/
INSERT INTO teste2 VALUES(1,’ccccc’, 6789)
/
INSERT INTO teste2 VALUES(1,’oooooo’, 555)
/
INSERT INTO teste2 VALUES(2,’xxxxx’, 101112)
/
INSERT INTO teste2 VALUES(2,’yyyyyy’, 5855)
/
INSERT INTO teste2 VALUES(3,’bbbbbb’, 3328)
/
INSERT INTO teste2 VALUES(8,’hhhhh’, 9999)
/
COMMIT
/CREATE OR REPLACE FUNCTION lista_nome (p_cod IN NUMBER) RETURN varchar2
ASv_cod NUMBER;
v_nome VARCHAR2(100);
concatena_nome VARCHAR2(4000);
resultado VARCHAR2(8000);CURSOR lista_campos IS
SELECT cod,nome FROM teste2 WHERE cod=p_cod ORDER BY cod;
BEGINOPEN lista_campos;
LOOP
FETCH lista_campos INTO v_cod, v_nome;
EXIT WHEN lista_campos%NOTFOUND;concatena_nome:= concatena_nome || ' ' || v_nome;
END LOOP;
CLOSE lista_campos;Resultado := (concatena_nome);
RETURN resultado;
END;
/
CREATE OR REPLACE FUNCTION lista_valor (p_cod IN NUMBER) RETURN varchar2
ASv_cod NUMBER;
v_valor NUMBER;
concatena_valor VARCHAR2(4000);
resultado VARCHAR2(8000);CURSOR lista_campos IS
SELECT cod,valor FROM teste2 WHERE cod=p_cod ORDER BY cod;
BEGINOPEN lista_campos;
LOOP
FETCH lista_campos INTO v_cod, v_valor;
EXIT WHEN lista_campos%NOTFOUND;concatena_valor:= concatena_valor || ' ' || v_valor;
END LOOP;
CLOSE lista_campos;Resultado := (concatena_valor);
RETURN resultado;
END;
/SELECT cod, lista_nome(cod) AS nome, lista_valor(cod) AS valor FROM teste2 GROUP by cod ORDER BY cod;
Espero ter ajudado!
Atenciosamente,
Felipe.12 de maio de 2011 às 6:50 pm #99200felipegParticipanteOla drigo,
Conseguiu realizar a atividade? Precisa de mais algum auxilio?
Atenciosamente,
Felipe.[quote=”felipeg”:1jq5es4u]Bom dia
Cara, segue um exemplo, coisa simples.
Se quiser utilizar, alterar ou jogar fora (risos) sinta-se a vontade.CREATE TABLE teste2(cod NUMBER, nome VARCHAR2(100),valor NUMBER)
/
INSERT INTO teste2 VALUES(1,’aaaaa’, 1234)
/
INSERT INTO teste2 VALUES(1,’ccccc’, 6789)
/
INSERT INTO teste2 VALUES(1,’oooooo’, 555)
/
INSERT INTO teste2 VALUES(2,’xxxxx’, 101112)
/
INSERT INTO teste2 VALUES(2,’yyyyyy’, 5855)
/
INSERT INTO teste2 VALUES(3,’bbbbbb’, 3328)
/
INSERT INTO teste2 VALUES(8,’hhhhh’, 9999)
/
COMMIT
/CREATE OR REPLACE FUNCTION lista_nome (p_cod IN NUMBER) RETURN varchar2
ASv_cod NUMBER;
v_nome VARCHAR2(100);
concatena_nome VARCHAR2(4000);
resultado VARCHAR2(8000);CURSOR lista_campos IS
SELECT cod,nome FROM teste2 WHERE cod=p_cod ORDER BY cod;
BEGINOPEN lista_campos;
LOOP
FETCH lista_campos INTO v_cod, v_nome;
EXIT WHEN lista_campos%NOTFOUND;concatena_nome:= concatena_nome || ' ' || v_nome;
END LOOP;
CLOSE lista_campos;Resultado := (concatena_nome);
RETURN resultado;
END;
/
CREATE OR REPLACE FUNCTION lista_valor (p_cod IN NUMBER) RETURN varchar2
ASv_cod NUMBER;
v_valor NUMBER;
concatena_valor VARCHAR2(4000);
resultado VARCHAR2(8000);CURSOR lista_campos IS
SELECT cod,valor FROM teste2 WHERE cod=p_cod ORDER BY cod;
BEGINOPEN lista_campos;
LOOP
FETCH lista_campos INTO v_cod, v_valor;
EXIT WHEN lista_campos%NOTFOUND;concatena_valor:= concatena_valor || ' ' || v_valor;
END LOOP;
CLOSE lista_campos;Resultado := (concatena_valor);
RETURN resultado;
END;
/SELECT cod, lista_nome(cod) AS nome, lista_valor(cod) AS valor FROM teste2 GROUP by cod ORDER BY cod;
Espero ter ajudado!
Atenciosamente,
Felipe.[/quote]4 de junho de 2011 às 12:31 am #99497burgaParticipanteHoje me inspirei pra quebrar um pouco a cabeça com esse problema… A resposta, escrevendo somente em SQL é esta:
WITH TAB1 AS
(SELECT CODPROCESSO,
NOME,
CPF,
VALOR,
ROW_NUMBER() OVER (PARTITION BY CODPROCESSO ORDER BY NOME) X
FROM USUARIO
),
TAB2 AS
(SELECT T.*, MAX(X) OVER (PARTITION BY CODPROCESSO) Y FROM TAB1 T
),
TAB3 AS
(SELECT CODPROCESSO,
TRIM(LEADING ',' FROM C1) NOME_AGRUPADO,
TRIM(LEADING ',' FROM C2) CPF_AGRUPADO,
TRIM(LEADING ',' FROM C3) VALOR_AGRUPADO,
FROM TAB2
MODEL
PARTITION BY (CODPROCESSO)
DIMENSION BY (X)
MEASURES (1 I, NOME, CPF, VALOR, Y,
CAST(NULL AS VARCHAR2(4000)) AS C1,
CAST(NULL AS VARCHAR2(4000)) AS C2,
CAST(NULL AS VARCHAR2(4000)) AS C3)
RULES ITERATE (10000) UNTIL (I[1] > Y[1])
( C1[1] = C1[1] || ',' || NOME,
C2[1] = C2[1] || ',' || CPF,
C3[1] = C3[1] || ',' || VALOR,
I[1] = I[1] + 1 )
)
SELECT * FROM TAB3 WHERE NOME_AGRUPADO IS NOT NULL;Sei que é um pouco tarde e você já deve ter resolvido seu problema de outra forma, mas estou postando só pra deixar registrado aqui se outras pessoas precisarem…
A mesma consulta na tabela HR.EMPLOYEES pra testarem:
WITH TAB_TEXTO AS (
SELECT MANAGER_ID, FIRST_NAME, JOB_ID,
ROW_NUMBER() OVER (PARTITION BY MANAGER_ID ORDER BY EMPLOYEE_ID) X
FROM HR.EMPLOYEES
WHERE MANAGER_ID IS NOT NULL),
TAB_TEXTO2 AS (
SELECT T.*, MAX(X) OVER (PARTITION BY MANAGER_ID) Y
FROM TAB_TEXTO T),
TAB_TEXTO3 AS (
SELECT MANAGER_ID,
TRIM(LEADING ',' FROM C1) C1,
TRIM(LEADING ',' FROM C2) C2
FROM TAB_TEXTO2
MODEL
PARTITION BY (MANAGER_ID)
DIMENSION BY (X)
MEASURES (FIRST_NAME, JOB_ID, Y,
CAST(NULL AS VARCHAR2(4000)) AS C1,
CAST(NULL AS VARCHAR2(4000)) AS C2)
RULES ITERATE (100) UNTIL (ITERATION_NUMBER+1 >= Y[1])
( C1[1] = C1[1] || ',' || FIRST_NAME[ITERATION_NUMBER+1],
C2[1] = C2[1] || ',' || JOB_ID[ITERATION_NUMBER+1]
))
SELECT * FROM TAB_TEXTO3 WHERE C1 IS NOT NULL;Abraços,
22 de julho de 2011 às 7:14 am #100114drigoParticipanteOlaa,
Muito obrigado pela atenção de todos, a ajuda foi de fundamental importância.
Novamente Obrigado.
-
AutorPosts
- Você deve fazer login para responder a este tópico.