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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar