Filtrar informações usando SQL

04/03/2022

0

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.
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

Lucas

Responder

Posts

05/03/2022

Alexandre Santos

Bom dia a todos!

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!
Responder

17/04/2022

Luiz Valencio

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:

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
Responder

19/04/2022

Emerson Nascimento

se você quer apenas classificar:
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

Responder

22/04/2022

Alex William

Olá, jovem. Tudo bem?

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. ;)
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar