Limitar o Nr de linhas retornadas pelo Sql

Olá,

Estou precisando criar um gráfico com os 20 melhores dias de vendas
Estou utilizando o banco de dados Postgres, coloquei o comando
LIMIT 20 no Sql da minha aplicação de consulta, mas o SC não está
respeitando este comando, não posso criar uma view para resolver
trazendo somente os 20 melhores, pois vou utilizar um where dinâmico
com vários parâmetros, alguém tem alguma sugestão ?

Sql que estou utilizando:

 SELECT SUM(fato_venda.valor) AS valor, 
            SUM(fato_venda.quantidade) AS quantidade,
            fato_venda.data
   FROM fato_venda

INNER JOIN dim_data_venda
ON dim_data_venda.data = fato_venda.data
GROUP BY fato_venda.data
ORDER BY valor DESC
LIMIT 20

Obrigado a Todos,

Clifor Travaini.

Clifortraviani,

Não faltou usar o OFFSET…

http://www.postgresql.org/docs/8.1/static/queries-limit.html

Olá, coloquei o OFFSET e ele me retorna o seguinte erro,

ERRO
Erro ao acessar o banco de dados
ERRO: erro de sintaxe em ou próximo a “asc” at character 297
SELECT fato_venda.data as fato_venda_data, SUM(fato_venda.quantidade) as quantidade, SUM(fato_venda.valor) as valor from fato_venda INNER JOIN dim_data_venda ON dim_data_venda.data = fato_venda.data group by fato_venda.data order by fato_venda.data asc, valor DESC LIMIT 20 OFFSET 20 [font=Verdana]asc[/font]

O SC coloca este “asc” no final do comando e dá erro,

Alguma sugestão de como corrigir isso ?
Obrigado,

Tente você colocar o ASC depois do OFFSET e ve se vai gerar o mesmo erro

O ASC é parametro do ORDER BY,
se eu colocar o “asc” após o OFFSET da erro mesmo no banco.

crie uma view para esse select e use a view na consulta.

Olá, já fiz com a view e funciona, mas tenho um problema, nao posso usar uma view,
pois vou utilizar o sc_select_where com diversos parametros, ai nao consigo aplicar
este where dinamico na view.

e criar uma store procedure com tabela temporaria?

Vou tentar esta opção, vlw

Olá, Stored Procedure não tem como, o SC não reconhece Stored Procedure no POSTGRESQL (talvez pq no postgres seja uma function) e na aplicação de consulta não está aceitando,

alguém tem outra sugestão ??

Obrigado,

Clifor Travani.

então crie uma tabela (não temporária) para guardar os registros processados e uma rotina php para alimentar essa tabela e crie a consulta em cima dela.

Olá Harold,
Fiz com uma tabela auxiliar, gravo os dados já agrupados como vou utilizar no relatório,
e fiz a consulta sobre esta tabela, até que funcionou, mas o desempenho ficou péssimo!

Más este vai ser o jeito até a netmake resolver o problema do “asc” no final do comando sql.

Obrigado pela ajuda,

Clifor Travaini.

Criou essa tabela com que tipo de engine? crie em memória.
em vez de rotina PHP para alimentar pode criar uma stored procedure para alimentar a tabela.
Se mesmo assim não for satisfatório, o ideal seria construir o relatório na unha, com poucas dependências do SC.
Estou construindo um relatório complexo, onde cada coluna são selects diferentes, e o mesmo tem 4 sessões com conteúdo totalmente diferente, uso inicialmente uma consulta com uma tabela com um único campo e 4 registros, (valores 1,2, 3 e 4) e dentro da onrecord construo o corpo das sessões, apesar da complexidade até o momento a performance não esta deixando a desejar, uso MYSQL compilado na versão da Google.

Na aplicação do ScriptCase desative a opção paginação, coloque a opção total, se não o ScriptCase vai tentar realizar a páginação e resolve seu problema original.

Mas a melhor solução é utilizar a view, mesmo que voce use where dinamico, voce pode trazer o where que voce quer como um campo no retorno da view e ai utilizar o where na view…

Criei uma tabela auxiliar e resolveu o problema, ficou bom, mas ficaria melhor direto no sql do scriptcase. Abri um ticket e vou aguardar.

Obrigado a todos.

Clifor Travaini.

Nesse exemplo eu tenho a liberdade de usar qualquer query sql:
http://www.netmake.com.br/forum/index.php?topic=2495.0

usa no final LIMIT 0,20 ai dá certo

o LIMIT já é utilizado no select principal da aplicação, por isso você não cosegue utiliza-lo, uma das saídas é a view, que não vejo problema em usar where dinamicamente.

Uma outra sugestão que me surgiu agora seria:

Select campos tabela_principal where id in (select id where condição limit 20)

deve funcionar.

Olá.
Tive este problema utilizando o PostgreSQL e resolvi colocando um artifício no próprio SQL. Segue exemplo:

SELECT * FROM customer WHERE id IN ( SELECT id FROM custumer ORDER BY id DESC LIMIT 5)

O exemplo acima é uma forma de driblar o ‘asc’ colocado no final do select. Notem que dei uma ordem para pegar somente os últimos 5 registros. Dessa forma pode-se utilizar em qualquer comando select da aplicação sem criar monstros como tabelas auxiliares.
Espero ter ajudado os amigos.
Att.

Boa tarde,

Apenas complementando as sugestões dos colegas, você pode desabilitar a paginação, e definir a quantidade de linhas por página para ZERO nas configurações da Grid.

Outra maneira é criar uma VIEW para limitar os registros retornados.

att,
Bernhard Bernsmann