Questão nº 68
Questão de Tecnologia da Informação · FGV TJ-AP 2024 (nº 68)
Observe a estrutura da tabela “Cliente” abaixo:
```
CREATE TABLE cliente (
cliente_ID NUMBER(12) PRIMARY KEY,
cidade VARCHAR2(50) NOT NULL,
limite_credito NUMBER(13,2) DEFAULT 0
);
```
Com o objetivo de gerar um relatório que mostre o limite de crédito médio para clientes em “Sao Paulo” e “Belo Horizonte”, a consulta a ser executada é:
- ASELECT cidade, AVG(NVL(limite_credito,0)) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE');
- BSELECT cidade, AVG(limite_credito) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE') GROUP BY cidade; (alternativa correta)
- CSELECT cidade, AVG(limite_credito) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE') GROUP BY cliente_ID;
- DSELECT cidade, AVG(limite_credito) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE') GROUP BY cidade, limite_credito;
- ESELECT cidade, AVG(limite_credito) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE') GROUP BY limite_credito, cidade;
Resposta comentada
Gabarito Alternativa B
Para obter resumos de dados, como a média ou a soma, para grupos específicos, usamos a cláusula `GROUP BY`. Ela agrupa linhas com valores idênticos em uma ou mais colunas, permitindo que funções de agregação (como `AVG` para média) operem sobre esses grupos.
(A) Incorreta: A consulta não possui a cláusula `GROUP BY cidade`, o que faria com que `AVG()` calculasse uma única média para todos os clientes das cidades selecionadas juntas, e não uma média para cada cidade separadamente. O `NVL` é redundante, pois a coluna tem `DEFAULT 0`.
(B) Correta: Esta é a consulta correta. O `WHERE` filtra os clientes das cidades desejadas, e o `GROUP BY cidade` agrupa os resultados por cidade, permitindo que a função `AVG(limite_credito)` calcule a média do limite de crédito para cada cidade individualmente, conforme solicitado.
(C) Incorreta: A armadilha da banca aqui é usar `GROUP BY cliente_ID`. Como `cliente_ID` é um identificador único para cada cliente, agrupar por ele significa que cada grupo terá apenas um cliente. Assim, `AVG(limite_credito)` retornaria o próprio limite de crédito de cada cliente, e não a média dos limites de crédito por cidade.
(D) Incorreta: Agrupar por `cidade, limite_credito` criaria grupos muito específicos. Um grupo seria formado por clientes que têm a mesma cidade E o mesmo limite de crédito. Isso não resultaria na média do limite de crédito para todos os clientes de uma cidade, mas sim na média de clientes com o mesmo limite dentro da mesma cidade (que seria o próprio limite, se todos no grupo tiverem o mesmo).
(E) Incorreta: Esta alternativa é funcionalmente idêntica à alternativa D. A ordem das colunas na cláusula `GROUP BY` não altera o resultado dos grupos formados. Portanto, sofre do mesmo problema de granularidade excessiva, não fornecendo a média por cidade.
Fonte: FGV TJ-AP 2024 Analista Judiciário - TI - Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.