Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024
- Código
- ce403598
- Banca
- CESPE / CEBRASPE
- Órgão
- CNPq
- Ano
- 2024
- Cargo
- Ana CT I ( )


- CCerto
- EErrado


GabaritoC — Certo
Gabarito: Certo. A expressão GROUP BY CUBE(categoria, modelo) gera todas as combinações possíveis de agrupamento entre as colunas categoria e modelo, incluindo os subtotais e o total geral, o que corresponde exatamente ao resultado apresentado na figura. A cláusula CUBE é uma extensão do GROUP BY que produz um conjunto de linhas com todas as combinações de agrupamento, e é isso que a questão explora.
A cláusula GROUP BY é usada para agrupar linhas que têm os mesmos valores em colunas específicas, permitindo aplicar funções de agregação como SUM, AVG, COUNT, MAX e MIN a cada grupo. No SQL padrão, além do GROUP BY simples, existem as extensões ROLLUP e CUBE, que geram subtotais e totais. O CUBE é o mais abrangente: ele calcula agregações para todas as combinações possíveis das colunas listadas. Se você tem duas colunas, categoria e modelo, o CUBE gera quatro níveis de agrupamento: (categoria, modelo), (categoria), (modelo) e (), onde () representa o total geral sem agrupamento. Isso é diferente do ROLLUP, que gera apenas uma hierarquia de subtotais, do mais específico para o mais geral, sem incluir todas as combinações.
Vamos entender com um exemplo prático. Suponha que a tabela dados tenha os seguintes registros:
categoria | modelo | valor |
|---|---|---|
A | X | 10 |
A | Y | 20 |
B | X | 30 |
B | Y | 40 |
A consulta SELECT categoria, modelo, SUM(valor) FROM dados GROUP BY CUBE(categoria, modelo) produziria o seguinte resultado:
categoria | modelo | SUM(valor) | |
|---|---|---|---|
A | X | 10 | |
A | Y | 20 | |
A | NULL | 30 | -- subtotal de A |
B | X | 30 | |
B | Y | 40 | |
B | NULL | 70 | -- subtotal de B |
NULL | X | 40 | -- subtotal de X |
NULL | Y | 60 | -- subtotal de Y |
NULL | NULL | 100 | -- total geral |
Observe que as linhas com NULL em uma ou ambas as colunas representam os subtotais e o total geral. A ordem das linhas pode variar conforme o SGBD, mas o conjunto de linhas é exatamente esse. A figura apresentada na questão mostra esse mesmo padrão de resultado, com as linhas de subtotal e total geral, o que confirma que a expressão SQL está correta.
A pegadinha que a banca explora aqui é a confusão entre CUBE e ROLLUP. O ROLLUP gera apenas uma hierarquia de subtotais, do mais específico para o mais geral, sem incluir todas as combinações. Por exemplo, GROUP BY ROLLUP(categoria, modelo) geraria apenas os grupos (categoria, modelo), (categoria) e (), mas não o grupo (modelo) isolado. Já o CUBE inclui todas as combinações, inclusive o grupo (modelo) isolado. Se a figura mostrasse apenas os subtotais de categoria e o total geral, sem os subtotais de modelo, a resposta seria Errado. Mas como a figura mostra todas as combinações, a resposta é Certo.
Outra confusão comum é pensar que o CUBE é equivalente a um GROUP BY simples com todas as colunas, mas não é: o GROUP BY simples agrupa apenas pela combinação exata das colunas, sem gerar subtotais. O CUBE é uma extensão que adiciona as linhas de subtotal e total. Portanto, a expressão apresentada está correta e produz o resultado mostrado.
A expressão SELECT categoria, modelo, SUM(valor) FROM dados GROUP BY CUBE(categoria, modelo) está correta e produz o resultado apresentado na figura. O CUBE gera todas as combinações possíveis de agrupamento entre categoria e modelo, incluindo os subtotais de cada coluna e o total geral, que é exatamente o que a figura mostra. A cláusula CUBE é uma extensão do GROUP BY que calcula agregações para todas as combinações de colunas listadas, e a figura reflete esse comportamento.
A banca explora a diferença entre CUBE e ROLLUP. O ROLLUP gera apenas uma hierarquia de subtotais (categoria, modelo → categoria → total), enquanto o CUBE gera todas as combinações (categoria, modelo → categoria → modelo → total). Se a figura mostrasse apenas os subtotais de categoria e o total geral, a resposta seria Errado. Mas como a figura mostra todas as combinações, a resposta é Certo. Fique atento a essa distinção, pois é uma pegadinha clássica em questões de SQL.
Gabarito: Certo
Link permanente: /questoes/ce403598