Mostrar 10 Primeiros/Ultimos
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:
mais não funcionou comigo...
[b:35462532d4]uso Interbase 6 e delphi 7[/b:35462532d4] :roll:
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
Curtidas 0
Respostas
Rjun
07/03/2006
Não sei no Interbase, mas no Sql Server para limitar o número de registros exibidos uso TOP.
SELECT TOP 10 * FROM Tabela
GOSTEI 0
Martins
07/03/2006
Com Firebird vc pode fazer assim.
Assim mostra os 10 primeiros como está no título.
Agora vc pode agrupar os mais vendidos e depois usar o select acima para limitar a exibição.
Boa sorte!!
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!!
GOSTEI 0
Spiritwwwalker
07/03/2006
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ê.
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ê.
GOSTEI 0
Paullsoftware
07/03/2006
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:
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:
GOSTEI 0
Aroldo Zanela
07/03/2006
Colega,
Tenta o código acima.
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.
GOSTEI 0
Paullsoftware
07/03/2006
Aroldo...
Não entendi o código
:oops:
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:
GOSTEI 0
Motta
07/03/2006
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 ?
GOSTEI 0
Paullsoftware
07/03/2006
+/- Motta...
a principio nunca vi nada igual, mais, vou tentar aqui e posto o resultado! :lol:
a principio nunca vi nada igual, mais, vou tentar aqui e posto o resultado! :lol:
GOSTEI 0
Paullsoftware
07/03/2006
pessoal, desculpem a ignorância mais não consegui fazer não...
GOSTEI 0
Aroldo Zanela
07/03/2006
Colega,
Por favor, coloca as DDLs das duas tabelas para que possamos simular por aqui.
Por favor, coloca as DDLs das duas tabelas para que possamos simular por aqui.
GOSTEI 0
Paullsoftware
07/03/2006
[quote:155f2e4f41=´Aroldo Zanela´]Colega,
Por favor, coloca as DDLs das duas tabelas para que possamos simular por aqui.[/quote:155f2e4f41]
ai vai! :wink:
quero criar uma VIEW com os campos:
Nome_Filme e Locado (onde locado seria o total de locações daquele filme)...
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)...
GOSTEI 0
Motta
07/03/2006
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
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
GOSTEI 0
Paullsoftware
07/03/2006
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?GOSTEI 0
Martins
07/03/2006
[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].
GOSTEI 0
Paullsoftware
07/03/2006
certo, mais sepreciso armazenar/mostar na tela no momento da locação como faria então!?
GOSTEI 0