Prévia do material em texto
UNIVERSIDADE PAULISTA – UNIP
CURSO: CIÊNCIA DA COMPUTAÇÃO – 3º E 4º SEMESTRE
LISTA DE EXERCÍCIOS – FUNÇÕES CONDICIONAIS E DATAS (MICROSOFT SQL SERVER)
Disciplina: Banco de Dados
Professor: _______________________
Data: ____/____/2025
Sorocaba – 2025
Script Inicial – Banco LojaFuncional
CREATE DATABASE LojaFuncional;
GO
USE LojaFuncional;
GO
CREATE TABLE Clientes (
id_cliente INT PRIMARY KEY IDENTITY(1,1),
nome_cliente VARCHAR(100),
cidade VARCHAR(50),
limite_credito DECIMAL(10,2),
telefone VARCHAR(20)
);
GO
CREATE TABLE Pedidos (
id_pedido INT PRIMARY KEY IDENTITY(1,1),
id_cliente INT FOREIGN KEY REFERENCES Clientes(id_cliente),
data_pedido DATE,
valor_total DECIMAL(10,2)
);
GO
INSERT INTO Clientes (nome_cliente, cidade, limite_credito, telefone) VALUES
('Ana Silva', 'Sorocaba', 2000.00, '15-99999-1111'),
('Bruno Costa', 'Votorantim', NULL, NULL),
('Carla Dias', 'Itu', 5000.00, '15-97777-2222'),
('Daniel Moreira', NULL, 1500.00, NULL),
('Eduardo Lima', 'Sorocaba', 0.00, '15-91234-5678');
GO
INSERT INTO Pedidos (id_cliente, data_pedido, valor_total) VALUES
(1, '2025-01-10', 1500.00),
(2, '2025-02-05', 250.00),
(3, '2025-02-25', 4200.00),
(4, '2025-03-10', 0.00),
(5, '2025-03-15', 750.00);
GO
Exercícios (20 itens)
Exercício 1
Liste o nome e o limite de crédito de cada cliente, substituindo valores nulos por 0 usando
COALESCE.
Exercício 2
Mostre o nome dos clientes e uma coluna indicando se possuem telefone cadastrado (Sim/Não)
utilizando IIF.
Exercício 3
Exiba o nome dos clientes e o limite de crédito, substituindo limite igual a 0 por NULL usando
NULLIF.
Exercício 4
Liste todos os clientes mostrando a cidade, substituindo NULL por 'Não Informada'.
Exercício 5
Mostre o nome do cliente e uma coluna chamada 'Status Crédito' classificando: acima de 3000
'Excelente', entre 1000 e 3000 'Bom', abaixo de 1000 'Baixo' usando CASE.
Exercício 6
Exiba o nome do cliente e os dias desde o último pedido usando DATEDIFF, considerando a
data mais recente de cada cliente.
Exercício 7
Mostre o nome do cliente, valor_total e uma coluna chamada 'Situação Pedido' com CASE: valor
> 3000 = 'Alto', entre 500 e 3000 = 'Médio', menor = 'Baixo'.
Exercício 8
Exiba os pedidos realizados no mês atual usando MONTH e YEAR com GETDATE.
Exercício 9
Mostre o nome do cliente e a data do pedido, substituindo datas nulas por a data atual com
COALESCE (use LEFT JOIN para trazer clientes sem pedido).
Exercício 10
Liste o nome do cliente e o valor_total, mostrando com IIF se o pedido foi maior que o limite de
crédito (Sim/Não). Para limite nulo, considere 0.
Exercício 11
Exiba o nome e o limite dos clientes cujo limite é igual ao valor do pedido mais recente. Além
disso, mostre a razão valor/limite usando NULLIF no divisor para evitar divisão por zero.
Exercício 12
Mostre o nome do cliente e uma coluna 'TipoCliente': se limite for nulo, 'Sem Cadastro'; se 0,
'Bloqueado'; senão 'Ativo'.
Exercício 13
Liste todos os pedidos mostrando o mês por extenso (ex.: Janeiro, Fevereiro) usando CASE com
MONTH(data_pedido).
Exercício 14
Mostre o nome do cliente e uma coluna 'Telefone Preferencial' substituindo NULL por 'Sem
Telefone' com COALESCE.
Exercício 15
Calcule o tempo médio (em dias) entre pedidos por cliente e apresente a média geral; evite
divisão por zero com NULLIF.
Exercício 16
Liste o nome do cliente e o número de meses desde o primeiro pedido até hoje (DATEDIFF).
Exercício 17
Mostre o nome do cliente e a comparação entre limite de crédito e valor do pedido: exiba 'Saldo
Positivo' se limite ≥ valor, caso contrário 'Estourou o Limite'.
Exercício 18
Apresente todos os clientes que não fizeram pedido algum.
Exercício 19
Mostre o valor total dos pedidos agrupado por cidade do cliente, substituindo cidades nulas por
'Indefinida'.
Exercício 20
Exiba os pedidos realizados há mais de 30 dias com a data e a diferença em dias em relação à
data atual.
Gabarito – Consultas SQL (Microsoft SQL Server)
Exercício 1
SELECT
nome_cliente,
COALESCE(limite_credito, 0) AS Limite
FROM Clientes;
Exercício 2
SELECT
nome_cliente,
IIF(telefone IS NOT NULL, 'Sim', 'Não') AS PossuiTelefone
FROM Clientes;
Exercício 3
SELECT
nome_cliente,
NULLIF(limite_credito, 0) AS Limite
FROM Clientes;
Exercício 4
SELECT
nome_cliente,
COALESCE(cidade, 'Não Informada') AS Cidade
FROM Clientes;
Exercício 5
SELECT
nome_cliente,
CASE
WHEN limite_credito > 3000 THEN 'Excelente'
WHEN limite_credito BETWEEN 1000 AND 3000 THEN 'Bom'
ELSE 'Baixo'
END AS Status_Credito
FROM Clientes;
Exercício 6
SELECT
c.nome_cliente,
DATEDIFF(DAY, ult.ultima_data, GETDATE()) AS DiasDesdeUltimoPedido
FROM Clientes c
JOIN (
SELECT id_cliente, MAX(data_pedido) AS ultima_data
FROM Pedidos
GROUP BY id_cliente
) AS ult
ON c.id_cliente = ult.id_cliente;
Exercício 7
SELECT
c.nome_cliente,
p.valor_total,
CASE
WHEN p.valor_total > 3000 THEN 'Alto'
WHEN p.valor_total BETWEEN 500 AND 3000 THEN 'Médio'
ELSE 'Baixo'
END AS Situacao_Pedido
FROM Pedidos p
JOIN Clientes c
ON p.id_cliente = c.id_cliente;
Exercício 8
SELECT *
FROM Pedidos
WHERE MONTH(data_pedido) = MONTH(GETDATE())
AND YEAR(data_pedido) = YEAR(GETDATE());
Exercício 9
SELECT
c.nome_cliente,
COALESCE(p.data_pedido, GETDATE()) AS DataPedido
FROM Clientes c
LEFT JOIN Pedidos p
ON c.id_cliente = p.id_cliente;
Exercício 10
SELECT
c.nome_cliente,
p.valor_total,
IIF(p.valor_total > COALESCE(c.limite_credito,0), 'Sim', 'Não') AS PedidoMaiorQueLimite
FROM Clientes c
JOIN Pedidos p
ON c.id_cliente = p.id_cliente;
Exercício 11
WITH Ultimo AS (
SELECT
id_cliente,
MAX(data_pedido) AS ultima_data
FROM Pedidos
GROUP BY id_cliente
),
PedidoMaisRecente AS (
SELECT p.id_cliente, p.valor_total
FROM Pedidos p
JOIN Ultimo u
ON p.id_cliente = u.id_cliente
AND p.data_pedido = u.ultima_data
)
SELECT
c.nome_cliente,
c.limite_credito,
pmr.valor_total AS ValorMaisRecente,
pmr.valor_total / NULLIF(c.limite_credito, 0) AS Razao_Valor_por_Limite
FROM Clientes c
JOIN PedidoMaisRecente pmr
ON pmr.id_cliente = c.id_cliente
WHERE c.limite_credito = pmr.valor_total;
Exercício 12
SELECT
nome_cliente,
CASE
WHEN limite_credito IS NULL THEN 'Sem Cadastro'
WHEN limite_credito = 0 THEN 'Bloqueado'
ELSE 'Ativo'
END AS TipoCliente
FROM Clientes;
Exercício 13
SELECT
id_pedido,
CASE MONTH(data_pedido)
WHEN 1 THEN 'Janeiro' WHEN 2 THEN 'Fevereiro'
WHEN 3 THEN 'Março' WHEN 4 THEN 'Abril'
WHEN 5 THEN 'Maio' WHEN 6 THEN 'Junho'
WHEN 7 THEN 'Julho' WHEN 8 THEN 'Agosto'
WHEN 9 THEN 'Setembro' WHEN 10 THEN 'Outubro'
WHEN 11 THEN 'Novembro' ELSE 'Dezembro'
END AS MesExtenso
FROM Pedidos;
Exercício 14
SELECT
nome_cliente,
COALESCE(telefone, 'Sem Telefone') AS TelefonePreferencial
FROM Clientes;
Exercício 15
WITH Estat AS (
SELECT
id_cliente,
MIN(data_pedido) AS primeiro,
MAX(data_pedido) AS ultimo,
COUNT(*) AS qtd
FROM Pedidos
GROUP BY id_cliente
)
SELECT
AVG(CAST(DATEDIFF(DAY, primeiro, ultimo) AS FLOAT) / NULLIF(qtd - 1, 0)) AS
MediaDiasEntrePedidos
FROM Estat;
Exercício 16
SELECT
c.nome_cliente,
DATEDIFF(MONTH, MIN(p.data_pedido), GETDATE()) AS MesesDesdePrimeiroPedido
FROM Clientes c
JOIN Pedidos p
ON c.id_cliente = p.id_cliente
GROUP BY c.nome_cliente;
Exercício 17
SELECT
c.nome_cliente,
p.valor_total,
c.limite_credito,
IIF(COALESCE(c.limite_credito,0) >= p.valor_total, 'Saldo Positivo', 'Estourou o Limite') AS
ComparacaoFROM Clientes c
JOIN Pedidos p
ON c.id_cliente = p.id_cliente;
Exercício 18
SELECT *
FROM Clientes c
WHERE NOT EXISTS (
SELECT 1
FROM Pedidos p
WHERE p.id_cliente = c.id_cliente
);
Exercício 19
SELECT
COALESCE(c.cidade,'Indefinida') AS Cidade,
SUM(p.valor_total) AS TotalPedidos
FROM Clientes c
JOIN Pedidos p
ON c.id_cliente = p.id_cliente
GROUP BY COALESCE(c.cidade,'Indefinida');
Exercício 20
SELECT
id_pedido,
data_pedido,
DATEDIFF(DAY, data_pedido, GETDATE()) AS DiasPassados
FROM Pedidos
WHERE DATEDIFF(DAY, data_pedido, GETDATE()) > 30;