[firebase-br] Ajuda em SQL - Linhas em uma unica coluna

Sandro Souza escovadordebits em gmail.com
Qui Jun 25 14:42:13 -03 2009


Bom dia/tarde Flávio.

Grande Flávio, dependendo da versão do Firebird, você poderia utilizar o
operador LIST, como no exemplo abaixo:

SELECT
  P.CODIGO,
  P.DESCRICAO,
  (SELECT
     LIST(C.DESCRICAO_COR, ' - ')
   FROM
     CORES C
   WHERE
     C.COD_PRODUTO = P.CODIGO) CORES,
  (SELECT
     LIST(T.DESCRICAO_TAM, ' - ')
   FROM
     TAMANHOS T
   WHERE
     T.COD_PRODUTO = P.CODIGO) TAMANHOS
FROM
  PRODUTOS P;

Caso a sua versão de Firebird ainda não tenha o operador LIST, então utilize
uma stored procedure como a seguinte:

SET TERM ^ ;

-- Concatena todos os registros e retorna o resultado.
CREATE OR ALTER PROCEDURE FBLIST (
  -- Código SQL que gerará os registros a serem concatenados.
  CODIGO_SQL VARCHAR(2048),
  -- String de separação dos possíveis valores.
  SEPARADOR VARCHAR(30)
) RETURNS (
  -- Resultado da concatenação.
  RESULTADO VARCHAR(32000)
) AS
DECLARE VARIABLE NOVO_VALOR VARCHAR(200);
BEGIN
  -- Não informou qualquer código SQL?
  IF ((CODIGO_SQL IS NULL)OR(CODIGO_SQL = '')) THEN
    -- Returna NULL.
    RESULTADO = NULL;
  ELSE
  BEGIN
    -- Não informou o separador de valores?
    IF ((SEPARADOR IS NULL)OR(SEPARADOR = '')) THEN
      -- Assume um separador padrão de valores.
      SEPARADOR = ',';
    -- Inicializa o resultado.
    RESULTADO = '';
    -- Laço de leitura e concatenação dos registros.
    FOR EXECUTE STATEMENT CODIGO_SQL INTO :NOVO_VALOR DO
    BEGIN
      -- Não é o primeiro valor?
      IF (RESULTADO <> '') THEN
        -- Concatena o separador de valores.
        RESULTADO = RESULTADO || SEPARADOR;
      -- Concatena o novo valor retornado.
      RESULTADO = RESULTADO || NOVO_VALOR;
    END -- FOR
  END -- ELSE
  -- Retorna a lista lida.
  SUSPEND;
END^

SET TERM ; ^

Agora é só testar da seguinte forma:

SELECT
  P.CODIGO,
  P.DESCRICAO,
  (SELECT
     RESULTADO
   FROM
     FBLIST('SELECT DESCRICAO_COR FROM CORES WHERE COD_PRODUTO = ' ||
P.CODIGO, ' - ')) CORES,
  (SELECT
     RESULTADO
   FROM
     FBLIST('SELECT DESCRICAO_TAM FROM TAMANHOS WHERE COD_PRODUTO = ' ||
P.CODIGO, ' - ')) TAMANHOS
FROM
  PRODUTOS P;

Espero ter ajudado mais que atrapalhado. :D

2009/6/25 Flávio Henrique Zangerolamo <flaviozan em ig.com.br>

> Boa Dia a todos
>
>
> Estou com o seguinte problema:
> Tenho uma tabela de produtos com vários campos. (Codigo, Descricao, etc...)
> Tenho uma tabela de cores que se relaciona com a de produtos(Cod_Produto,
> Cod_Cor, Descricao_Cor)
> Tenho uma tabela de Tamanhos que se relaciona a de Produto(Cod_Produto,
> Cod_Tamanho, Descricao_Tamanho)
>
> Preciso montar um select que retorne da seguinte forma:
> Codigo_Produto, Descricao_Produto, Cores(exemplo: AZUL - VERMELHO - etc),
> Tamanhos (P - M - G - GG - etc)
>
> ou seja, preciso que o resultado da tabela de Cores e de Tamanhos seja
> retornado em apenas uma linha
>
> Desde já Agradeço..
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista