Considere a execução dos seguintes comandos em SQL: CREATE T...
Considere a execução dos seguintes comandos em SQL:
CREATE TABLE vendas (
id INT UNSIGNED NOT NULL
AUTO_INCREMENT PRIMARY KEY,
dat_venda DATETIME NOT NULL
DEFAULT CURRENT_TIMESTAMP,
vendedor VARCHAR(15) NOT NULL,
cliente VARCHAR(15) NOT NULL,
uf CHAR(2) NOT NULL DEFAULT 'RJ',
produto VARCHAR(15) NOT NULL
DEFAULT 'PROD1',
qtde INT NOT NULL,
valor_unitario FLOAT DEFAULT NULL);
INSERT INTO vendas (
dat_venda, vendedor, cliente, uf, produto, qtde,
valor_unitario) VALUES ('2023-01-01', 'VEND001',
'CLI001', 'SP', 'PROD3', 2, 20);
INSERT INTO vendas (
dat_venda, vendedor, cliente, uf, produto, qtde,
valor_unitario) VALUES ('2023-01-02', 'VEND001',
'CLI001', 'SP', 'PROD3', 3, 20);
INSERT INTO vendas (
dat_venda, vendedor, cliente, uf, produto, qtde,
valor_unitario) VALUES ('2023-01-01', 'VEND002',
'CLI002', 'RJ', 'PROD1', 20, 5);
INSERT INTO vendas (
dat_venda, vendedor, cliente, uf, produto, qtde,
valor_unitario) VALUES ('2023-01-05', 'VEND001',
'CLI001', 'SC', 'PROD3', 2, 20);
INSERT INTO vendas (
dat_venda, vendedor, cliente, uf, produto, qtde,
valor_unitario) VALUES ('2023-01-06', 'VEND002',
'CLI002', 'MG', 'PROD2', 5, 10);
INSERT INTO vendas (
dat_venda, vendedor, cliente, uf, produto, qtde,
valor_unitario) VALUES ('2023-01-05', 'VEND003',
'CLI004', 'RJ', 'PROD3', 2, 20);
INSERT INTO vendas (
dat_venda, vendedor, cliente, uf, produto, qtde,
valor_unitario) VALUES ('2023-01-04', 'VEND003',
'CLI003', 'SC', 'PROD4', 10, 3);
SELECT V1.vendedor, V1.uf, COUNT(*) AS qtde_vendas,
SUM(V1.qtde*V1.valor_unitario) AS total_venda,
V2.media_venda
FROM vendas V1
INNER JOIN
(SELECT vendedor,
AVG(qtde* valor_unitario) AS media_venda
FROM vendas
GROUP BY vendedor
) V2
ON V2.vendedor = V1.vendedor
WHERE V1.dat_venda
BETWEEN '2023-01-01' AND '2023-01-04'
GROUP BY V1.vendedor, V1.uf
HAVING SUM(V1.qtde*V1.valor_unitario) > V2.media_venda
ORDER BY V1.vendedor;
Após a execução dos comandos apresentados, a quantidade de
linhas que a consulta irá retornar é:
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: A - 2.
Para resolver essa questão, é necessário compreender o funcionamento das instruções SQL envolvendo a criação de tabelas (CREATE TABLE
), inserção de dados (INSERT INTO
) e a seleção de dados com condições e agregações específicas (SELECT
, GROUP BY
, HAVING
, ORDER BY
) e o uso de subconsultas.
A tabela vendas
criada possui um campo de autoincremento id, que serve como chave primária, campos para data da venda, vendedor, cliente, estado (UF), produto, quantidade e valor unitário, com valores padrão definidos para alguns deles.
Os comandos INSERT INTO
adicionam dados à tabela, e uma série de vendas é registrada com diferentes vendedores, clientes, UFs, produtos, quantidades e valores unitários.
A consulta SELECT
realizada no final busca informações agrupadas por vendedor e UF, calcula a quantidade de vendas e o total de vendas, e a compara com a média de vendas por vendedor obtida em uma subconsulta.
O ponto chave está na cláusula WHERE, que restringe os resultados às vendas ocorridas entre '2023-01-01' e '2023-01-04', e na cláusula HAVING, que compara o total de vendas de cada vendedor com sua média de vendas, retornando somente aqueles que têm um total de vendas superior à média.
Revisando os dados inseridos, e considerando as condições, verificamos que:
- Vendas do vendedor 'VEND001' na data '2023-01-01' e '2023-01-02' são consideradas, mas a venda do dia '2023-01-05' não é incluída;
- Vendas do vendedor 'VEND002' na data '2023-01-01' são consideradas, mas a venda do dia '2023-01-06' não é incluída;
- Vendas do vendedor 'VEND003' na data '2023-01-04' são consideradas, mas a venda do dia '2023-01-05' não é incluída.
Após somar os totais e calcular a média de vendas por vendedor, apenas as linhas que correspondem aos vendedores cujo total de vendas no período especificado exceda a média de vendas desse vendedor serão retornadas. Isso resulta na contagem de 2 linhas, correspondentes aos vendedores 'VEND001' e 'VEND002' para os UF 'SP' e 'RJ', respectivamente.
A correta filtragem e interpretação dos resultados de acordo com as condições da cláusula HAVING são essenciais para chegar à resposta correta, que é a alternativa A - 2.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Alguém da uma luz ai??
Essa é obrigatória pular na prova
a famosa questão de loteria kkkkkkkk
- Comecei fazendo o ALIAS V2
SELECT vendedor,
AVG(qtde* valor_unitario) AS media_venda
FROM vendas
GROUP BY vendedor
) V2
Resultado V2:
vendedor | media_venda
VEND001 | 43,3 -- (140/3)
VEND002 | 75,0 -- (150/2)
VEND003 | 35,0 -- (70/2)
- Depois o ALIAS V1 (sem os filtros)
vendedor | uf | qtde_vendas | total_venda | venda_media
VEND001 | SP | 2 | 100 | 43,3
VEND001 | SC | 1 | 40 | 43,3
VEND002 | RJ | 1 | 100 | 75,0
VEND002 | MG | 1 | 50 | 75,0
VEND003 | RJ. | 1 | 40 | 35,0
VEND003 | SC | 1 | 30 | 35,0
- Marcando em vermelho os registros afetados pelo filtro do BETWEEN:
vendedor | uf | qtde_vendas | total_venda | venda_media
VEND001 | SP | 2 | 100 | 43,3
VEND001 | SC | 1 | 40 | 43,3. -- dat_venda = '2023-01-05'
VEND002 | RJ | 1 | 100 | 75,0
VEND002 | MG | 1 | 50 | 75,0 -- dat_venda = '2023-01-05'
VEND003 | RJ. | 1 | 40 | 35,0 -- dat_venda = '2023-01-05'
VEND003 | SC | 1 | 30 | 35,0
- Marcando em vermelho os registro afetados pelo HAVING:
vendedor | uf | qtde_vendas | total_venda | venda_media
VEND001 | SP | 2 | 100 | 43,3
VEND002 | RJ | 1 | 100 | 75,0
VEND003 | SC | 1 | 30 | 35,0 -- total_venda < venda_media
- No final, restam somente 2 registros:
vendedor | uf | qtde_vendas | total_venda | venda_media
VEND001 | SP | 2 | 100 | 43,3
VEND002 | RJ | 1 | 100 | 75,0
Gabarito: A
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo