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

Flávio Henrique Zangerolamo flaviozan em ig.com.br
Qui Jun 25 17:03:27 -03 2009


Sandro muito obrigado cara, funcionou certinho...

2009/6/25 Sandro Souza <escovadordebits em gmail.com>

> 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