Ajuda em aplicar Count e Max

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Dom, 20 Jan 2008 6:16 pm

Boas.

Como é que se pode fazer uma query sem ser por vistas, por exemplo para dizer qual o cliente com maior numero de multas?
Ou o cliente que comprou mais um produto xpto?

É que sempre que tento aplicar um count e um max na query dá-me sempre erro.


Obrigado
SepulRise
Localização: Portugal

Mensagemem Dom, 20 Jan 2008 6:29 pm

Código: Selecionar todos
select a.nome, c.nome_produto, count(b.QUANTIDADE_PRODUTO) as Quantidades
from cliente a, linha_compra b, produto c, compra d
where c.nome_produto= 'Farinha' and
c.id_produto = b.id_produto and
b.id_compra = d.id_compra and
a.id_cliente = d.ID_CLIENTE
group by a.nome, c.nome_produto
order by Quantidades desc;

esqueci de meter a query que tinha feito.
SepulRise
Localização: Portugal

Mensagemem Seg, 21 Jan 2008 7:12 am

Brother,

Posta pra gente aqui o erro que está ocorrendo.
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Seg, 21 Jan 2008 8:35 am

qual é o erro qui retorna quando você executa esse select ??
gokden
Localização: Ribeirão Preto - SP

Lucas de Souza

OCA Developer
Analista de sistemas

Mensagemem Seg, 21 Jan 2008 12:04 pm

Desculpem eu expliquei-me mal.

A query não dá erro, mas eu queria retornar era o máximo que resulta dessa query. E não consigo fazer isso.

Obrigado e peço desculpa por não me ter explicado bem.
SepulRise
Localização: Portugal

Mensagemem Seg, 21 Jan 2008 12:09 pm

Brother, tranquilo?

Faz um teste ai, com este exemplo abaixo:
Código: Selecionar todos
SELECT MAX(b.QUANTIDADE_PRODUTO)
  FROM produto b;


Qualquer coisa, manda aqui pra gente, beleza?
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Seg, 21 Jan 2008 12:23 pm

Mas é possivel fazer isso na mesma query que indiquei em cima?
SepulRise
Localização: Portugal

Mensagemem Seg, 21 Jan 2008 12:42 pm

Brother,

Faz 1 teste ai (não tenho a tua modelagem.. se der algum erro, retorna aqui):
Código: Selecionar todos

SELECT   a.nome,
         c.nome_produto,
         b.quantidade_produto AS quantidades
    FROM cliente a,
         linha_compra b,
         produto c,
         compra d
   WHERE c.id_produto   = b.id_produto
     AND b.id_compra    = d.id_compra
     AND a.id_cliente   = d.id_cliente
     AND b.quantidade_produto = (SELECT MAX(quantidade_produto)
                                   FROM produto
                                  WHERE c.nome_produto = 'Farinha')
ORDER BY b.quantidade_produto DESC;
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Seg, 21 Jan 2008 12:54 pm

O codigo funciona na perfeição. Obrigadão.

Mas tenho mais uma pequena duvida. É possivel nessa ultima query, fazer devolver só o primeiro resultado?

Ela devolve vários máximos por pessoa, mas como fazer para devolver o maior máximo?


Obrigado
SepulRise
Localização: Portugal

Mensagemem Seg, 21 Jan 2008 1:17 pm

Brother,

Este máximo por pessoa, é porquê N pessoas tem o mesmo valor máximo?

Caso positivo, trazer qual? Qualquer um deles?
Tem como postar o resultado da query (caso não seja muito grande) aqui?
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Seg, 21 Jan 2008 1:31 pm

Ok vou postar o resultado da query.

Imagem
SepulRise
Localização: Portugal

Mensagemem Seg, 21 Jan 2008 1:35 pm

Agora nessa listagem que voces podem ver eu keria só seleccionar o primeiro resultado. Ou seja seleccionar o máximo dos máximos :)


Obrigado
SepulRise
Localização: Portugal

Mensagemem Seg, 21 Jan 2008 1:49 pm

Brother,

Não consegui visualizar a imagem.
Tem como mandar por e-mail?
Vou mandar meu e-mail na tua caixa de mensagens aqui do fórum.
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Seg, 21 Jan 2008 6:20 pm

Pelo que entendi, você quer apenas a priemira linha de retorno da consulta
Código: Selecionar todos
select a.nome, c.nome_produto, count(b.QUANTIDADE_PRODUTO) as Quantidades
from cliente a, linha_compra b, produto c, compra d
where c.nome_produto= 'Farinha' and
c.id_produto = b.id_produto and
b.id_compra = d.id_compra and
a.id_cliente = d.ID_CLIENTE
group by a.nome, c.nome_produto
order by Quantidades desc;

, certo?

Se for isso mesmo, você poderia fazer o seguinte:
Código: Selecionar todos
select * from
(
select a.nome, c.nome_produto, count(b.QUANTIDADE_PRODUTO) as Quantidades
from cliente a, linha_compra b, produto c, compra d
where c.nome_produto= 'Farinha' and
c.id_produto = b.id_produto and
b.id_compra = d.id_compra and
a.id_cliente = d.ID_CLIENTE
group by a.nome, c.nome_produto
order by Quantidades desc
) where rownum < 2


Claro que, no caso acima, se houverem dois ou mais clientes com a mesma quantidade máxima, apenas um deles será retornado.

Para exibir todos os resultados, você poderia fazer:
Código: Selecionar todos
select nome, nome_produto, quantidade
from
(
  select nome, nome_produto, quantidade, rank() over (order by quantidade desc) seq
  from
  (
    select a.nome, c.nome_produto, count(b.QUANTIDADE_PRODUTO) as Quantidades
    from cliente a, linha_compra b, produto c, compra d
    where c.nome_produto= 'Farinha' and
    c.id_produto = b.id_produto and
    b.id_compra = d.id_compra and
    a.id_cliente = d.ID_CLIENTE
    group by a.nome, c.nome_produto
  ) where seq = 1
)
rogenaro
Localização: Londrina - PR

Rafael O. Genaro

Mensagemem Seg, 21 Jan 2008 8:36 pm

No codigo
Código: Selecionar todos
select nome, nome_produto, quantidade
from
(
  select nome, nome_produto, quantidade, rank() over (order by quantidade desc) seq
  from
  (
    select a.nome, c.nome_produto, count(b.QUANTIDADE_PRODUTO) as Quantidades
    from cliente a, linha_compra b, produto c, compra d
    where c.nome_produto= 'Farinha' and
    c.id_produto = b.id_produto and
    b.id_compra = d.id_compra and
    a.id_cliente = d.ID_CLIENTE
    group by a.nome, c.nome_produto
  ) where seq = 1
)

da-me o seguinte erro: ) where seq = 1
*

ERRO na linha 14:
ORA-00904: "SEQ": identificador inválido
SepulRise
Localização: Portugal

Mensagemem Ter, 22 Jan 2008 7:40 am

E ai SepulRise, beleza??

nesse consulta você precisa fazer 2 ajustes, um deles é referente ao nome que você deu pra coluna onde você usa o count, nesse caso você deu o nome "Quantidades", porem no ponto onde você usa o Rank você usa o nome "Quantidade".
O segundo ponto é o local onde você colocou o seq, você deixou ele junto com o select do rank, mas nesse caso você precisa colocar ele no where do nivel acima..
segue aqui o select pronto.. tenta rodar ele, qualquer coisa é só falar.

Código: Selecionar todos
SELECT nome, nome_produto, quantidade
  FROM (SELECT nome, nome_produto, quantidade,
               RANK () OVER (ORDER BY quantidades DESC) seq
          FROM (SELECT a.nome, c.nome_produto,
                       COUNT (b.quantidade_produto) AS quantidades
                  FROM cliente a, linha_compra b, produto c, compra d
                 WHERE c.nome_produto = 'Farinha'
                   AND c.id_produto = b.id_produto
                   AND b.id_compra = d.id_compra
                   AND a.id_cliente = d.id_cliente
                 GROUP BY a.nome, c.nome_produto
               )
       )
WHERE seq = 1

[]'s
Tineks
Localização: Araraquara - SP

Cristiano (Tineks)
Araraquara - SP

Mensagemem Ter, 22 Jan 2008 9:11 am

Beleza.

Esta ultima query funcionou. Valeu cara.

Obrigado pela ajuda ppl.

Abraços...
SepulRise
Localização: Portugal

Mensagemem Ter, 22 Jan 2008 5:37 pm

nesse consulta você precisa fazer 2 ajustes, um deles é referente ao nome que você deu pra coluna onde você usa o count, nesse caso você deu o nome "Quantidades", porem no ponto onde você usa o Rank você usa o nome "Quantidade".
O segundo ponto é o local onde você colocou o seq, você deixou ele junto com o select do rank, mas nesse caso você precisa colocar ele no where do nivel acima..
segue aqui o select pronto.. tenta rodar ele, qualquer coisa é só falar.


Ops.. falha minha...

Valeu por corrigir a query, Tineks.[/quote]
rogenaro
Localização: Londrina - PR

Rafael O. Genaro

Mensagemem Qua, 23 Jan 2008 7:23 am

Opa, tranquilo Rafael!!
uma coisa ou outra as vezes passa sem agente perceber.... rsrs..

abraços!!!!
Tineks
Localização: Araraquara - SP

Cristiano (Tineks)
Araraquara - SP


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes