Fórum Filtrar informações usando SQL #617717
04/03/2022
0
Estou iniciando meus aprendizados em SQL, estou usando a base de dados de exemplo do SQL Server (Sakila) para fazer alguns teste, queria fazer uma operação com duas tabelas a payment (pagamentos efetuados pelos clientes) e a customer (lista de clientes cadastrados).
Até o momento agrupei os dados pelo cliente e agreguei uma coluna ''Maior Valor'' que traz o maior valor pago entre os clientes.
Select
pay.customer_id,
cli.first_name,
cli.last_name,
Max(pay.amount) as ''Maior valor''
from customer cli
JOIN payment pay ON (cli.customer_id = pay.customer_id)
group by cli.customer_id;
Até aqui rodou tudo bem, estou tentando pensar em uma forma de classificar esses clientes pelo maior valor, por exemplo quem teve uma compra igual ou a cima de 10.99 poderia ter um status de ''VIP'' e quem teve a baixo poderia receber como ''NO VIP'', até o momento consigo trazer cada um por vez, usando:
Where (Select max(pay.amount) from payment) >= 10.99 -- Filtra os que são maiores
Porém ao usar esse select o código fica umas 50x mais demorado, além de não conseguir colocar todos os dados colocando o status de ''VIP'' e ''NO VIP''.
Alguém poderia me dar uma sugestão, por favor?
Desde já agradeço!
Lucas
Curtir tópico
+ 0Posts
05/03/2022
Alexandre Santos
Estou iniciando meus aprendizados em SQL, ...
Olá Lucas.
Não sei se entendi bem o que você precisa. Construí o código abaixo. Veja se te ajuda.
SELECT
cli.first_name,
cli.last_name,
paymnt.valor AS ''Maior valor'',
paymnt.status
FROM customer cli
JOIN (SELECT pay.customer_id,
Max(pay.amount) AS valor,
CASE Max(pay.amount)
WHEN >= 10.99 THEN 'VIP'
ELSE 'NO VIP'
END AS Status
FROM payment pay
GROUP BY pay.customer_id ) AS paymnt
ON (cli.customer_id = paymnt.customer_id)
ORDER BY status, last_name, first_nameNão tenho SQL Server instalado. Por isto não testei.
Boa sorte!
Gostei + 0
17/04/2022
Luiz Valencio
Não ficou muito claro se deseja trazer o resultado agrupado, filtrado ou simplesmente classificado pelo valor.
A query abaixo faz uma classificação simples, com base no valor:
Select
pay.customer_id,
cli.first_name,
cli.last_name,
case
when pay.amount >= 10.99 then 'VIP'
else 'NO VIP'
end as Maior_valor
from customer cli
JOIN payment pay
ON (cli.customer_id = pay.customer_id)
group by 1,2,3,4
Gostei + 0
19/04/2022
Emerson Nascimento
Select
cli.customer_id,
cli.first_name,
cli.last_name,
Max(pay.amount) as 'Maior valor'
(case when Max(pay.amount) > 10.99 then 'VIP' else 'NO VIP' end) situacao
from
customer cli
JOIN
payment pay ON (pay.customer_id = cli.customer_id)
group by
cli.customer_id,
cli.first_name,
cli.last_namese você quer filtrar:
Select
cli.customer_id,
cli.first_name,
cli.last_name,
Max(pay.amount) as 'Maior valor'
from
customer cli
JOIN
payment pay ON (pay.customer_id = cli.customer_id)
group by
cli.customer_id,
cli.first_name,
cli.last_name
having
Max(pay.amount) >= 10.99Gostei + 0
22/04/2022
Alex William
O que ocorre, é que seu WHERE está fazendo um tablescan na tabela denovo.
Troque:
Where (Select max(pay.amount) from payment) >= 10.99 -- Filtra os que são maiores
Por:
Where max(pay.amount) >= 10.99 -- Filtra os que são maiores
Você já está refenciando a tabela payment no select, não há necessidade de fazer outro select nela.
Teste, e veja se funciona.
Espero ter ajudado. ;)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)