Considere a execução dos seguintes comandos em SQL: CREATE T...

Próximas questões
Com base no mesmo assunto
Q2220437 Banco de Dados

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 é: 


Alternativas

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