Página 1 de 1

Ajuda em aplicar Count e Max

Enviado: Dom, 20 Jan 2008 6:16 pm
por SepulRise
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

Enviado: Dom, 20 Jan 2008 6:29 pm
por SepulRise

Selecionar tudo

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.

Enviado: Seg, 21 Jan 2008 7:12 am
por Trevisolli
Brother,

Posta pra gente aqui o erro que está ocorrendo.

Enviado: Seg, 21 Jan 2008 8:35 am
por gokden
qual é o erro qui retorna quando você executa esse select ??

Enviado: Seg, 21 Jan 2008 12:04 pm
por SepulRise
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.

Enviado: Seg, 21 Jan 2008 12:09 pm
por Trevisolli
Brother, tranquilo?

Faz um teste ai, com este exemplo abaixo:

Selecionar tudo

SELECT MAX(b.QUANTIDADE_PRODUTO)
  FROM produto b;
Qualquer coisa, manda aqui pra gente, beleza?

Enviado: Seg, 21 Jan 2008 12:23 pm
por SepulRise
Mas é possivel fazer isso na mesma query que indiquei em cima?

Enviado: Seg, 21 Jan 2008 12:42 pm
por Trevisolli
Brother,

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

Selecionar tudo


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;

Enviado: Seg, 21 Jan 2008 12:54 pm
por SepulRise
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

Enviado: Seg, 21 Jan 2008 1:17 pm
por Trevisolli
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?

Enviado: Seg, 21 Jan 2008 1:31 pm
por SepulRise
Ok vou postar o resultado da query.

Imagem

Enviado: Seg, 21 Jan 2008 1:35 pm
por SepulRise
Agora nessa listagem que voces podem ver eu keria só seleccionar o primeiro resultado. Ou seja seleccionar o máximo dos máximos :)


Obrigado

Enviado: Seg, 21 Jan 2008 1:49 pm
por Trevisolli
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.

Enviado: Seg, 21 Jan 2008 6:20 pm
por rogenaro
Pelo que entendi, você quer apenas a priemira linha de retorno da consulta

Selecionar tudo

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:

Selecionar tudo

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:

Selecionar tudo

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
)

Enviado: Seg, 21 Jan 2008 8:36 pm
por SepulRise
No codigo

Selecionar tudo

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

Enviado: Ter, 22 Jan 2008 7:40 am
por Tineks
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.

Selecionar tudo

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

Enviado: Ter, 22 Jan 2008 9:11 am
por SepulRise
Beleza.

Esta ultima query funcionou. Valeu cara.

Obrigado pela ajuda ppl.

Abraços...

Enviado: Ter, 22 Jan 2008 5:37 pm
por rogenaro
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]

Enviado: Qua, 23 Jan 2008 7:23 am
por Tineks
Opa, tranquilo Rafael!!
uma coisa ou outra as vezes passa sem agente perceber.... rsrs..

abraços!!!!