Pular para o conteúdo
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #99093
    drigo
    Participante

      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 – 44444

      Existe 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 44444

      Desde Já, Agradeço.

      #99096
      leandrolbs
      Participante

        não entendi, vc quer 3 linhas na mesma linha?

        #99097
        drigo
        Participante

          Prezado 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 —— 22222

          Minha 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,22222

          Ou 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.

          #99098
          leandrolbs
          Participante

            neste 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.

            #99100
            rman
            Participante

              Onde 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…

              #99102
              felipeg
              Participante

                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
                AS

                v_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;
                BEGIN

                OPEN 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
                AS

                v_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;
                BEGIN

                OPEN 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.

                #99200
                felipeg
                Participante

                  Ola 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
                  AS

                  v_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;
                  BEGIN

                  OPEN 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
                  AS

                  v_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;
                  BEGIN

                  OPEN 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]

                  #99497
                  burga
                  Participante

                    Hoje 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,

                    #100114
                    drigo
                    Participante

                      Olaa,

                               Muito obrigado pela atenção de todos, a ajuda foi de fundamental importância.
                      

                      Novamente Obrigado.

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.
                    plugins premium WordPress