Aqui estão alguns exercícios comuns de consultas SQL em uma única tabela para ajudar no entendimento do T-SQL.
Antes de resolver os problemas, é importante entender a ordem lógica dos componetnes de uma consulta SQL:
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
Você pode usar o script SQL fornecido abaixo para criar um banco de dados, tabelas e inserir dados.
Tarefas:
1. Retornar pedidos gerados em junho de 2007:
Solução:
SELECT id_pedido, data_pedido, id_cliente, id_funcionario
FROM Vendas.Pedidos
WHERE data_pedido >= '2007-06-01'
AND data_pedido < '2007-07-01';
2. Retornar pedidos gerados no último dia de cada mês:
Solução:
SELECT id_pedido, data_pedido, id_cliente, id_funcionario
FROM Vendas.Pedidos
WHERE data_pedido = DATEADD(month, DATEDIFF(month, '2005-12-31', data_pedido), '2005-12-31');
3. Encontrar funcionários cujo sobrenome contém duas ou mais letras 'a':
Solução:
SELECT id_funcionario, nome, sobrenome
FROM RH.Funcionarios
WHERE sobrenome LIKE '%a%a%';
4. Listar todos os pedidos com valor total maior que 10.000, ordenados pelo valor:
Solução:
SELECT id_pedido, SUM(preco_unitario * quantidade) AS valor_total
FROM Vendas.DetalhesPedidos
GROUP BY id_pedido
HAVING SUM(preco_unitario * quantidade) > 10000
ORDER BY valor_total DESC;
5. Exibir os três países com maior média de frete em 2007:
Solução:
SELECT TOP(3) pais_envio, AVG(frete) AS media_frete
FROM Vendas.Pedidos
WHERE data_pedido >= '2007-01-01' AND data_pedido < '2008-01-01'
GROUP BY pais_envio
ORDER BY media_frete DESC;
6. Calcular um número de linha para cada pedido de cliente, ordenado por data do pedido:
Solução:
SELECT id_cliente, data_pedido, id_pedido,
ROW_NUMBER() OVER (PARTITION BY id_cliente ORDER BY data_pedido, id_pedido) AS numero_linha
FROM Vendas.Pedidos
ORDER BY id_cliente, numero_linha;
7. Determinar o gênero baseado no título de cortesia dos funcionários:
Solução usando CASE:
SELECT id_funcionario, nome, sobrenome, titulo_cortesia,
CASE WHEN titulo_cortesia IN ('Sra.', 'Srta.') THEN 'Feminino'
WHEN titulo_cortesia = 'Sr.' THEN 'Masculino'
ELSE 'Desconhecido'
END AS genero
FROM RH.Funcionarios;
8. Mostrar cleintes e suas regiões, ordenando por região e colocando valores NULL no final:
Solução:
SELECT id_cliente, regiao
FROM Vendas.Clientes
ORDER BY CASE WHEN regiao IS NULL THEN 1 ELSE 0 END, regiao;