Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026
Banco de Dados›Consultas e Comandos em SQL
Código
fc142300
Banca
FCC
Órgão
SEFAZ MT
Ano
2026
Cargo
FTE ( )
Em uma data warehouse em que ARRECADACAO_ICMS registra valores mensais por contribuinte e exercício, e sendo necessário exibir cada mês mantendo a granularidade, mas também o total anual por contribuinte em cada linha, a abordagem mais adequada é utilizar SUM(valor_icms)
AOVER(PARTITION BY exercicio) e filtrar contribuinte em etapa posterior.
Bem subconsulta correlacionada por mês para simular janela analítica, pois reduz a complexidade.
COVER() para retornar o total geral do estado em todas as linhas.
DOVER(PARTITION BY contribuinte_id, exercicio) para total anual por contribuinte.
EOVER(ORDER BY exercicio) para total anual isolado por contribuinte.
Revelar gabarito e comentário▾
GabaritoD — OVER(PARTITION BY contribuinte_id, exercicio) para total anual por contribuinte.
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”.
Funções Analíticas (Window Functions) em SQL
Gabarito: letra D. Para exibir cada mês mantendo a granularidade e, ao mesmo tempo, o total anual por contribuinte em cada linha, a abordagem correta é usar SUM(valor_icms) OVER(PARTITION BY contribuinte_id, exercicio). Essa é a função de janela que calcula a soma anual para cada contribuinte sem agrupar as linhas, preservando a granularidade mensal — exatamente o que o enunciado pede.
A questão trata de funções analíticas (window functions), um recurso do SQL que permite calcular valores agregados (como soma, média, contagem) sem perder as linhas individuais do resultado. Diferente do GROUP BY, que colapsa várias linhas em uma só, a função de janela mantém todas as linhas e adiciona uma coluna com o valor calculado para um conjunto de linhas relacionadas — a "janela".
A sintaxe básica é função_agregada(coluna) OVER (PARTITION BY coluna_para_particao). O PARTITION BY divide o conjunto de resultados em partições (grupos) e a função é aplicada a cada partição separadamente. No nosso caso, queremos o total anual por contribuinte, então a partição deve ser por contribuinte_id e exercicio. Assim, para cada linha (que representa um mês de um contribuinte em um ano), a coluna calculada trará a soma de todos os valores daquele contribuinte naquele ano.
Vamos a um exemplo concreto. Suponha que a tabela ARRECADACAO_ICMS tenha os seguintes dados:
contribuinte_id
exercicio
mes
valor_icms
1
2024
1
100
1
2024
2
150
1
2024
3
200
2
2024
1
300
2
2024
2
400
A consulta SELECT contribuinte_id, exercicio, mes, valor_icms, SUM(valor_icms) OVER(PARTITION BY contribuinte_id, exercicio) AS total_anual FROM ARRECADACAO_ICMS retornaria:
contribuinte_id
exercicio
mes
valor_icms
total_anual
1
2024
1
100
450
1
2024
2
150
450
1
2024
3
200
450
2
2024
1
300
700
2
2024
2
400
700
Perceba que cada linha mensal é preservada e a coluna total_anual repete o total do ano para cada contribuinte. É exatamente isso que o enunciado pede: "exibir cada mês mantendo a granularidade, mas também o total anual por contribuinte em cada linha".
A alternativa que descreve corretamente essa solução é a letra D, que especifica OVER(PARTITION BY contribuinte_id, exercicio). As demais alternativas ou usam a partição errada, ou usam uma abordagem desnecessariamente complexa, ou calculam um total diferente do que foi pedido. O critério decisivo é: a partição deve conter exatamente as colunas que definem o grupo do total desejado — neste caso, contribuinte_id e exercicio.
Função de janela (OVER): PARTITION BY (Divide em grupos, Total fixo por grupo); ORDER BY (Janela cumulativa, Total cresce linha a linha); Sem PARTITION BY (Total geral em todas as linhas); Granularidade (Mantém linhas individuais, GROUP BY colapsa linhas)
Alternativa A — ❌ Incorreta
A alternativa propõe OVER(PARTITION BY exercicio), que agruparia apenas por exercício, somando os valores de todos os contribuintes para aquele ano. Isso retornaria o total anual do estado, não o total anual por contribuinte. Além disso, filtrar o contribuinte em etapa posterior (com WHERE) não resolveria o problema, pois a janela já teria sido calculada com todos os contribuintes, e o filtro apenas removeria linhas, não recalcularia a soma. O erro está na partição: falta o contribuinte_id.
Alternativa B — ❌ Incorreta
A alternativa sugere usar uma subconsulta correlacionada por mês para simular uma janela analítica, alegando que isso reduz a complexidade. Isso é falso: subconsultas correlacionadas são, em geral, mais complexas e menos eficientes do que funções de janela. Além disso, uma subconsulta correlacionada por mês não produziria o total anual por contribuinte em cada linha — ela teria que ser correlacionada por contribuinte e exercício, o que seria ainda mais complicado. A função de janela é a abordagem mais simples e direta.
Alternativa C — ❌ Incorreta
A alternativa propõe OVER() sem PARTITION BY, o que cria uma única partição com todas as linhas da tabela. Isso retornaria o total geral do estado (soma de todos os valores de todos os contribuintes e todos os anos) em todas as linhas. Não é o que o enunciado pede, que é o total anual por contribuinte.
Alternativa D — ✅ Correta ⟵ GABARITO
A alternativa especifica OVER(PARTITION BY contribuinte_id, exercicio), que divide as linhas em partições definidas pela combinação de contribuinte e exercício. Para cada partição, a função SUM(valor_icms) calcula o total anual daquele contribuinte, e esse valor é repetido em todas as linhas da partição. Isso mantém a granularidade mensal (cada linha continua representando um mês) e adiciona o total anual por contribuinte em cada linha, exatamente como pedido.
Alternativa E — ❌ Incorreta
A alternativa propõe OVER(ORDER BY exercicio), que cria uma janela cumulativa ordenada por exercício. Isso calcularia um total acumulado ao longo dos anos para cada contribuinte (ou para todos, dependendo do contexto), não o total anual isolado. Além disso, sem PARTITION BY contribuinte_id, a janela misturaria os contribuintes, e o ORDER BY exercicio sozinho não agrupa por contribuinte. O resultado seria um total acumulado geral, não o total anual por contribuinte.
NÃO CAIA NESSA!
A banca explora a confusão entre PARTITION BY e ORDER BY dentro da função de janela. PARTITION BY divide o conjunto em grupos independentes (cada grupo recebe seu próprio total), enquanto ORDER BY cria uma janela cumulativa (o total vai crescendo linha a linha). Para um total anual fixo por contribuinte, o correto é PARTITION BY contribuinte_id, exercicio — sem ORDER BY. Fique atento: se a alternativa trouxer ORDER BY no lugar de PARTITION BY, ela está calculando um acumulado, não um total por grupo.
PEGA ESSA DICA!
Para resolver questões de função de janela, identifique primeiro qual é o grupo do total desejado. Pergunte: "o total deve ser por quê?" — por contribuinte? por ano? por contribuinte e ano? A resposta define as colunas do PARTITION BY. Depois, verifique se a granularidade deve ser mantida (cada linha individual) — se sim, é função de janela; se não, é GROUP BY. Essa é a chave para não errar.