Fórum Mostrar 10 Primeiros/Ultimos #315297

07/03/2006

0

Pessoal to com uma dúvida de tirar o meu sono, como faço para limitar o exibição de (x) registros de uma determinada tabela, por exemplo:

se x = 10 então
quero saber os 10 produtos mais vendidos da minha loja??

me passaram esse código em SQL, mais não funcionou:
select left :x detlocacao.cod_filme, count(detlocacao.cod_filme) as Locacoes
from
 detlocacao
where
 detlocacao.userdataalterou =:DATA
group by
 detlocacao.cod_filme
order by
 2 desc

mais não funcionou comigo...

[b:35462532d4]uso Interbase 6 e delphi 7[/b:35462532d4] :roll:


Paullsoftware

Paullsoftware

Responder

Posts

07/03/2006

Rjun

Não sei no Interbase, mas no Sql Server para limitar o número de registros exibidos uso TOP.

SELECT TOP 10 * FROM Tabela



Responder

Gostei + 0

07/03/2006

Martins

Com Firebird vc pode fazer assim.

Assim mostra os 10 primeiros como está no título.
SELECT FIRST 10 CAMPOS FROM TABELA 


Agora vc pode agrupar os mais vendidos e depois usar o select acima para limitar a exibição.

Boa sorte!!


Responder

Gostei + 0

08/03/2006

Spiritwwwalker

Prezado Paull:

Quando li seu tópico, imediatamente me veio à cabeça o atributo TOP para selecionar uma determinada quantidade de registros, porém até então imaginava que ele não fazia parte do padrão SQL ANSI, tratando-se de uma implementação do MS Access, mas como o colega Rjun afirma que o atributo TOP também é utilizado no SQL Server, então presumo que ele deva fazer parte de outras implementações SQL do mercado ou, ao menos, de uso exclusivo das ferramentas Microsoft. Sendo assim, convém lembrar que o emprego de TOP, em determinadas circunstâncias, não retorna EXATAMENTE a quantidade de registros especificada, visto que a consulta incluirá produtos de preços semelhantes. Por exemplo:

SELECT TOP 10 Produtos FROM tblProdutos WHERE Categoria = ´Enlatados´ ORDER BY Preco DESC

A consulta poderá retornar os 10 produtos de custo mais elevado da categoria ´Enlatados´, mas se uma famigerada lata de ervilhas (ou de milho... ) :D de determinada marca tiver preço idêntico ao de uma concorrente, a listagem será composta de 11 e não 10 registros.
Eu nunca testei a utilização do atributo TOP em Delphi, mas se a solução proposta pelo colega Martins também não funcionar, então só resta criar um loop que percorra todos os registros, selecionando e comparando os valores até atingir a quantidade desejada. Ao final, convém verificar se eventualmente não há produtos com preços similares ao último registro, do contrário, a consulta não estará completa (motivo pelo qual o atributo TOP não retorna exatamente a quantidade especificada). Espero ter ajudado. Boa sorte para você.


Responder

Gostei + 0

08/03/2006

Paullsoftware

prezados amigos,

se funciona com vc´s não sei, sei que comigo não funciona eu já tentei diversas formas de fazer isso inclusive usando esses comandos já citados por vc´s...

nenhum dos comandos [b:c11ec84b62]Left, Top, Rows, First[/b:c11ec84b62]... funcionaram comigo.. tanto pelo IbExpert como pela SQL da tabela através do Delphi. por isso então resolvi postar aqui no fórum.

a propósito [b:c11ec84b62]SpiritWWWalker[/b:c11ec84b62], não access sei que funciona a função TOP mais apenas em access, isso eu usava através de consulta e só fazia chamá-la pelo delphi, mais agora to usando [b:c11ec84b62]Interbase[/b:c11ec84b62] e não sei qual comando/função/código devo usar.
Grato a todos pela colaboração! :cry:


Responder

Gostei + 0

08/03/2006

Aroldo Zanela

Colega,

select T1.* from catalogo T1
where
(select sum(1) FROM catalogo T2 where
(T2.cat_id<=T1.cat_id) )<=3
ORDER BY T1.cat_id asc


Tenta o código acima.


Responder

Gostei + 0

08/03/2006

Paullsoftware

Aroldo...
select T1.* from catalogo T1 where (select sum(1) FROM catalogo T2 where (T2.cat_id<=T1.cat_id) )<=3 ORDER BY T1.cat_id asc


Não entendi o código
:oops:


Responder

Gostei + 0

08/03/2006

Motta

SELECT *
FROM (SELECT VP1.*,(SELECT COUNT(*)
                    FROM (SELECT DISTINCT(QTD_MOEDA) QTD_MOEDA
                          FROM VALORES VP2) T
                    WHERE T.QTD_MOEDA > VP1.QTD_MOEDA) QTD
      FROM VALORES VP1) TUDO
WHERE QTD < 3
ORDER BY 4 DESC


tabela

valores
--------
qtd_moeda

obtem que tem a qtd de valores maiores menores que o limite 3 no caso

exempo

123 5
234 4
345 3
567 2 <<
678 1 <<
789 0 <<

ok ?


Responder

Gostei + 0

08/03/2006

Paullsoftware

+/- Motta...
a principio nunca vi nada igual, mais, vou tentar aqui e posto o resultado! :lol:


Responder

Gostei + 0

14/03/2006

Paullsoftware

pessoal, desculpem a ignorância mais não consegui fazer não...


Responder

Gostei + 0

14/03/2006

Aroldo Zanela

Colega,

Por favor, coloca as DDLs das duas tabelas para que possamos simular por aqui.


Responder

Gostei + 0

14/03/2006

Paullsoftware

[quote:155f2e4f41=´Aroldo Zanela´]Colega,

Por favor, coloca as DDLs das duas tabelas para que possamos simular por aqui.[/quote:155f2e4f41]

ai vai! :wink:

CREATE TABLE DETLOCACAO (
    CODIGO           INTEGER NOT NULL,
    LOCACAO          INTEGER,
    FILME            INTEGER,
    DIARIA           INTEGER,
    NOME_FILME       VARCHAR(50),
    COD_FILME        INTEGER DEFAULT 0,
    VALOR_FILME      DECIMAL(6,2),
    BONUS            VARCHAR(1) DEFAULT ´N´,
    DEVOLVIDO        VARCHAR(1) DEFAULT ´N´,
    DATADEVOLVIDO    TIMESTAMP,
    USERINCLUIU      VARCHAR(10),
    USERDATAINCLUIU  TIMESTAMP DEFAULT ´NOW´,
    USERALTEROU      VARCHAR(10),
    USERDATAALTEROU  TIMESTAMP DEFAULT ´NOW´
);


quero criar uma VIEW com os campos:
Nome_Filme e Locado (onde locado seria o total de locações daquele filme)...


Responder

Gostei + 0

14/03/2006

Motta

DETLOCACAO é uma tabela ou view ? se for tabela acho que vc tem um problema de modelagem pois replica o nome do filme na locação.

select para obter a qtd de locados

SELECT NOME_FILME,COUNT(*) QTD
FROM DETLOCACAO
GROUP BY NOME_FILME

VIEW

CREATE OR REPLAVE VIEW V_LOCADOS
AS
SELECT NOME_FILME,COUNT(*) QTD
FROM DETLOCACAO
GROUP BY NOME_FILME


SELECT DE 10 MAIS LOCADOS
....


SELECT *
FROM (SELECT VP1.*,(SELECT COUNT(*)
FROM (SELECT DISTINCT(QTD) QTD
FROM V_LOCADOS VP2) T
WHERE T.QTD > VP1.QTD ) QTD
FROM V_LOCADOS VP1) TUDO
WHERE QTD < 11
ORDER BY 4 DESC


ALGUNS BANCO NAO PERMITEM UM SUBSELECT POREM

BOA SORTE


Responder

Gostei + 0

15/03/2006

Paullsoftware

DETLOCACAO é uma tabela ou view ? se for tabela acho que vc tem um problema de modelagem pois replica o nome do filme na locação.
agora fiquei curioso... onde?


Responder

Gostei + 0

15/03/2006

Martins

[quote:73f673328e]DETLOCACAO é uma tabela ou view ? se for tabela acho que vc tem um problema de modelagem pois replica o nome do filme na locação.
agora fiquei curioso... onde?[/quote:73f673328e]

[b:73f673328e]CREATE TABLE DETLOCACAO [/b:73f673328e]( CODIGO INTEGER NOT NULL, LOCACAO INTEGER, [b:73f673328e]FILME[/b:73f673328e] INTEGER, DIARIA INTEGER, [color=red:73f673328e][b:73f673328e]NOME_FILME[/b:73f673328e] [/color:73f673328e] VARCHAR(50), COD_FILME INTEGER DEFAULT 0, VALOR_FILME DECIMAL(6,2), BONUS VARCHAR(1) DEFAULT ´N´, DEVOLVIDO VARCHAR(1) DEFAULT ´N´, DATADEVOLVIDO TIMESTAMP, USERINCLUIU VARCHAR(10), USERDATAINCLUIU TIMESTAMP DEFAULT ´NOW´, USERALTEROU VARCHAR(10), USERDATAALTEROU TIMESTAMP DEFAULT ´NOW´ );


Supondo q vc tenha uma tabela Filmes e q o Campo[b:73f673328e] Filme [/b:73f673328e]de DETLOCACAO armazene o código do filme, não se faria necessário o[color=darkred:73f673328e] [b:73f673328e]nome_filme[/b:73f673328e][/color:73f673328e], a menos q seja uma [b:73f673328e]View[/b:73f673328e].


Responder

Gostei + 0

15/03/2006

Paullsoftware

certo, mais sepreciso armazenar/mostar na tela no momento da locação como faria então!?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar