Filtrar informações usando SQL
Bom dia a todos!
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.
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:
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!
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
Curtidas 0
Respostas
Alexandre Santos
04/03/2022
Bom dia a todos!
Estou iniciando meus aprendizados em SQL, ...
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!
GOSTEI 0
Luiz Valencio
04/03/2022
Olá Lucas, tudo bem?
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:
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
Emerson Nascimento
04/03/2022
se você quer apenas classificar:
se você quer filtrar:
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
GOSTEI 0
Alex William
04/03/2022
Olá, jovem. Tudo bem?
O que ocorre, é que seu WHERE está fazendo um tablescan na tabela denovo.
Troque:
Por:
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. ;)
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