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_nameNã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_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
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