Filtrar informações usando SQL
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
Posts
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_name
Não tenho SQL Server instalado. Por isto não testei.
Boa sorte!
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
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_name
se 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.99
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. ;)
Clique aqui para fazer login e interagir na Comunidade :)