/*
Daê Thiago

Abaixo uma possível solução para o seu problema, desenvolvida
utilizando o padrão POG:

*/
-- Tabelinha de teste
create table teste(id serial, descricao text, valor decimal(8,2));

-- View auxiliar para definir tipo de retorno da função (chuncho)
create view teste_view as select *, null::char(1) from teste;

-- Função pra popular a tabelinha teste (chuncho de teste)
CREATE OR REPLACE FUNCTION public.popula_teste()
  RETURNS boolean AS
$BODY$
DECLARE
        contador integer;
BEGIN
        contador := 1;
        for contador in 0..200
        loop
                insert into teste values(contador,'desc '||contador::varchar,
contador*10::decimal);
        end loop;
                
        RETURN true;
EXCEPTION
        WHEN OTHERS THEN
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

-- Popula a tabelinha teste com a função (gambiarra básica... )
select popula_teste();

-- Cria função que retorna os 100 primeiros registros da tabela teste
-- onde os 25 primeiros terão o atributo classe = A, os 25 seguintes = B, etc...
CREATE OR REPLACE FUNCTION public.select_classific()
  RETURNS SETOF teste_view AS
$BODY$
DECLARE
        contador smallint;
        classe char(1);
        registro teste_view%rowtype;
BEGIN
        for contador in 0..3 loop
                classe := (case
                                when contador = 0 then 'A'
                                when contador = 1 then 'B'
                                when contador = 2 then 'C'
                                else 'D'
                            end);
                for registro in
                        select id, descricao,valor,classe
                          from teste
                         order by valor desc
                         limit 25 offset 25*contador
                loop
                        RETURN NEXT registro;
                end loop;
        end loop;       
        RETURN;
EXCEPTION
        WHEN OTHERS THEN
END;
$BODY$ LANGUAGE 'plpgsql';


-- Utilização da função
select * from public.select_classific() ;

-- :p

/*

Apesar de ser uma solução POG, utilizo coisa semelhante aqui na nossa
empresa e tem funcionado bem...

Abrç

Chiqueti

*/

2009/8/17 Thiago <zan...@farmaponte.com.br>:
> Galera, bom dia.
>
> Seguinte estou precisando fazer um select em uma base de produtos onde
> vou encontrar as curvas de vendas dos produtos, ou seja, tenho um select
> que me retorna 100 itens quero que para os 25% que listarem primeiro me
> mostre A, para os próximos 25% mostre B e na sequencia C e D.
>
> Pensei em fazer manualmente utilizando algum tipo de paginação, tipo,
> faço um select com limit 25 por exemplo (essa conta vou ter que fazer na
> mão) e tipo em um outro select listo mais 25 mas mostrando a partir do 26.
>
> Existe como fazer isso?
>
> Obrigado!
>
> _______________________________________________
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a