Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026

Banco de DadosConsultas e Comandos em SQL
Código
fc142290
Banca
FCC
Órgão
SEFAZ MT
Ano
2026
Cargo
FTE ( )
Em um processo anual de consolidação de arrecadação, totais de ICMS por município devem ser inseridos em uma tabela histórica a partir da tabela operacional, garantindo consistência do agregado no momento da inserção. A abordagem SQL no Oracle que melhor atende ao requisito é INSERT
  1. AALL sem agregação, delegando totalização para relatórios posteriores.
  2. BINTO ... SELECT ... com GROUP BY por município para gerar uma linha por município.
  3. Ccom subconsulta correlacionada no SELECT retornando múltiplas linhas por município.
  4. DINTO ... SELECT ... com SUM(...) OVER(PARTITION BY município) mantendo todas as linhas.
  5. Elinha a linha por cursor implícito para cada município encontrado.
Revelar gabarito e comentário

GabaritoB — INTO ... SELECT ... com GROUP BY por município para gerar uma linha por município.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Inserção de dados agregados em SQL: INSERT INTO ... SELECT com GROUP BY

Gabarito: letra B. Para inserir totais de ICMS por município em uma tabela histórica, a abordagem correta é INSERT INTO ... SELECT ... GROUP BY município, pois o GROUP BY agrega as linhas da tabela operacional, gerando exatamente uma linha por município com o total somado — é a única alternativa que produz o agregado desejado no momento da inserção, garantindo a consistência do dado histórico.

O problema central é: como transformar uma tabela operacional com várias linhas por município (cada uma representando uma operação de arrecadação) em uma tabela histórica com uma única linha por município contendo o total de ICMS? A resposta está na combinação de duas cláusulas SQL: INSERT INTO ... SELECT e GROUP BY.

O comando INSERT INTO ... SELECT é uma forma de inserir dados em uma tabela a partir do resultado de uma consulta. Em vez de fornecer valores literais com VALUES, você fornece uma consulta SELECT que retorna as linhas a serem inseridas. Essa é a abordagem ideal para consolidar dados de uma tabela operacional para uma tabela histórica, pois permite transformar e agregar os dados durante a inserção.

A cláusula GROUP BY é usada para agrupar linhas que têm os mesmos valores em colunas especificadas, permitindo aplicar funções de agregação (como SUM, COUNT, AVG) a cada grupo. No nosso caso, agrupando por município e aplicando SUM(valor_icms), obtemos o total de ICMS arrecadado por município. O resultado é uma linha por município, exatamente o que a tabela histórica precisa.

A sintaxe seria algo como:

INSERT INTO tabela_historica (municipio, total_icms)
SELECT municipio, SUM(valor_icms)
FROM tabela_operacional
GROUP BY municipio;

Essa abordagem é declarativa e eficiente: o banco de dados processa a consulta, agrega os dados e insere o resultado em uma única operação. Não há necessidade de cursores ou processamento linha a linha, que seriam mais lentos e propensos a erros.

A pegadinha da questão está em distinguir GROUP BY (agregação) de funções analíticas (OVER(PARTITION BY)), que não agregam linhas, e de subconsultas correlacionadas, que podem retornar múltiplas linhas. A banca explora exatamente essa confusão: o candidato que conhece SUM mas não sabe a diferença entre agregação e função analítica pode cair na alternativa D.

Guarde o critério decisivo: para gerar uma linha por município com o total, é preciso GROUP BY; funções analíticas com OVER(PARTITION BY) mantêm todas as linhas originais e apenas adicionam uma coluna com o total calculado. É nessa fronteira que as alternativas se dividem.

  1. 1INSERT INTO tabela_histórica
  2. 2SELECT município, SUM(ICMS)
  3. 3FROM tabela_operacional
  4. 4GROUP BY município
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

INSERT ALL sem agregação insere todas as linhas da tabela operacional na tabela histórica, sem qualquer totalização. Isso não atende ao requisito de "totais de ICMS por município" — a tabela histórica ficaria com múltiplas linhas por município, e a consistência do agregado não seria garantida no momento da inserção. A totalização ficaria delegada a relatórios posteriores, o que contraria o enunciado.

Alternativa B — ✅ Correta ⟵ GABARITO

INSERT INTO ... SELECT ... GROUP BY município é exatamente a abordagem correta. O GROUP BY agrupa as linhas da tabela operacional por município, e a função de agregação SUM calcula o total de ICMS para cada grupo. O resultado é uma linha por município, que é inserida na tabela histórica. Isso garante a consistência do agregado no momento da inserção, pois o total é calculado e armazenado de uma só vez.

Alternativa C — ❌ Incorreta

Uma subconsulta correlacionada no SELECT retornando múltiplas linhas por município não agrega os dados. Uma subconsulta correlacionada é avaliada para cada linha da consulta externa, e se ela retornar múltiplas linhas, o banco de dados pode até gerar um erro (se a subconsulta retornar mais de uma linha em um contexto que espera um único valor). Mesmo que funcionasse, não produziria o total por município — apenas repetiria valores ou causaria erro.

Alternativa D — ❌ Incorreta

INSERT INTO ... SELECT ... SUM(...) OVER(PARTITION BY município) usa uma função analítica (window function), que não agrega linhas. A função SUM(...) OVER(PARTITION BY município) calcula o total de ICMS para cada município, mas mantém todas as linhas originais da tabela operacional, adicionando uma coluna com o total calculado. O resultado seria múltiplas linhas por município, não uma linha por município. Isso não atende ao requisito de gerar uma linha por município na tabela histórica.

Alternativa E — ❌ Incorreta

Inserir linha a linha por cursor implícito para cada município encontrado é uma abordagem procedural e ineficiente. Embora possa funcionar, ela é muito mais lenta e complexa do que a abordagem declarativa com INSERT INTO ... SELECT ... GROUP BY. Além disso, o enunciado pede a abordagem que "melhor atende ao requisito", e a abordagem set-based (declarativa) é sempre preferível em SQL por ser mais eficiente e concisa.

NÃO CAIA NESSA!

A banca troca GROUP BY (agregação) por OVER(PARTITION BY) (função analítica). O candidato que sabe que SUM soma, mas não distingue os dois contextos, pode marcar a alternativa D. Lembre-se: GROUP BY reduz o número de linhas (uma por grupo); OVER(PARTITION BY) mantém todas as linhas e apenas adiciona uma coluna com o valor calculado. Com treino, você enxerga essa troca de longe 💪

PEGA ESSA DICA!

Para questões de consolidação/agregação, pergunte-se: "o resultado deve ter uma linha por grupo ou todas as linhas originais?" Se for uma linha por grupo, use GROUP BY; se for manter as linhas e adicionar uma coluna calculada, use funções analíticas com OVER(PARTITION BY). Essa distinção é a chave para resolver esse tipo de questão.

Gabarito: letra B

Link permanente: /questoes/fc142290