Agrupamento ? SQL

7 respostas
T

Olá turma,

Tenho a tabela serviço, com os dados abaixo:

id_os nome_produto
1 produto1
1 produto2
1 produto3
2 produto1
2 produto2

Gostaria de saber se tem como rodar um select em cima dessa tabela pra obter o seguinte resultado:

id_os nome_produto
1 produto1, produto2, produto3
2 produto1, produto2

7 Respostas

Marlon_Meneses

no mysql isso é feito pela instrucao group_concat
qual o banco que vc está usando?

E

tiago.rol:
Olá turma,

Tenho a tabela serviço, com os dados abaixo:

id_os nome_produto
1 produto1
1 produto2
1 produto3
2 produto1
2 produto2

Gostaria de saber se tem como rodar um select em cima dessa tabela pra obter o seguinte resultado:

id_os nome_produto
1 produto1, produto2, produto3
2 produto1, produto2

Da pra vc colocar a estrutura da tabela ai e explicar um pouco melhor o que você quer fazer?

T

A estrutura da tabela já segue acima. O banco é o postgreSQL.

E

Cara, você pode criar uma função pra fazer isso, segue o exemplo abaixo.

CREATE TABLE teste
(
  id serial NOT NULL,
  coluna character varying(255),
  CONSTRAINT teste_pkey PRIMARY KEY (id)
);

CREATE OR REPLACE FUNCTION CONCATENA_COLUNA()
RETURNS text AS '
DECLARE ret TEXT;
DECLARE temp RECORD;

BEGIN
  ret := '''';
  
  FOR temp IN 
    select 
      * 
    from teste 
    LOOP
        ret := ret || temp.coluna; 
    END LOOP;

  
  RETURN ret;

END;'
LANGUAGE 'plpgsql';

select concatena_coluna();

Esse exemplo retorna um texto com a coluna “coluna” da tabela “teste” concatenada.

T

Essa forma aí até funciona, porém está amarrada a tabela. Teria como receber (nessa função) como parâmetro um resultado de um select?

E

Se eu não me engano, tem um comando no postgresql que executa uma string como sql, assim que eu tiver um tempo, te mando a função alterada.

E

Da uma olhada nessa função pra ver se te atende.

--parâmetros: tabela, coluna
CREATE OR REPLACE FUNCTION CONCATENA_COLUNA(varchar, varchar)
RETURNS text AS 
$BODY$
DECLARE ret TEXT;
DECLARE temp RECORD;

BEGIN
  ret := '';
  
  FOR temp IN 
    execute
    'select ' ||
     $2 || ' as coluna 
     from ' || $1
    LOOP
        ret := ret || cast(temp.coluna as text); 
    END LOOP;

  
  RETURN ret;

END;
$BODY$
LANGUAGE 'plpgsql';
Criado 9 de junho de 2009
Ultima resposta 10 de jun. de 2009
Respostas 7
Participantes 3