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
SepulRise
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

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
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

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.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

Brother,

Posta pra gente aqui o erro que está ocorrendo.
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

qual é o erro qui retorna quando você executa esse select ??
SepulRise
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

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.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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?
SepulRise
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

Mas é possivel fazer isso na mesma query que indiquei em cima?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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;
SepulRise
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

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
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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?
SepulRise
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

Ok vou postar o resultado da query.

Imagem
SepulRise
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

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


Obrigado
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

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
)
SepulRise
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

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
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

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
SepulRise
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Dom, 20 Jan 2008 6:11 pm
Localização: Portugal

Beleza.

Esta ultima query funcionou. Valeu cara.

Obrigado pela ajuda ppl.

Abraços...
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

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]
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

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

abraços!!!!
Responder
  • Informação
  • Quem está online

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