Uma base tributária de uma SEFAZ possui duas tabelas: contribuinte (id, cpf_cnpj, nome, situação) débitos (id, contribuinte_id, valor, tipo_tributo, data_vencimento) A equipe de Banco de Dados deseja listar contribuintes ativos, exibindo o nome e o valor total de débitos vencidos, considerando apenas tributos do tipo IPTU (isto é, data_vencimento anterior à data atual). Considerando consultas escritas em um SGBD em que não há mais de um contribuinte com o mesmo nome na base de dados e em que CURRENT_DATE retorna a data atual, a consulta SQL que atende ao requisito é:
ASELECT c.nome, SUM(d.valor) FROM contribuinte c JOIN debitos d ON c.id = d.id WHERE c.situacao = 'ATIVO' AND d.tipo_tributo = 'IPTU' AND d.data_vencimento < CURRENT_DATE GROUP BY c.nome;
BSELECT nome, SUM(valor) FROM contribuinte c LEFT JOIN debitos d ON c.id = d.contribuinte_id WHERE situacao = 'ATIVO' GROUP BY nome HAVING tipo_tributo = 'IPTU';
CSELECT c.nome, SUM(d.valor) AS total_debitos FROM contribuinte c JOIN debitos d ON c.id = d.contribuinte_id WHERE c.situacao = 'ATIVO' AND d.tipo_tributo = 'IPTU' AND d.data_vencimento < CURRENT_DATE GROUP BY c.nome;
DSELECT c.nome, valor FROM contribuinte c JOIN debitos d ON c.id = d.contribuinte_id WHERE c.situacao = 'ATIVO' AND d.data_vencimento < CURRENT_DATE;
ESELECT c.nome, SUM(d.valor) FROM contribuinte c WHERE c.situacao = 'ATIVO' AND d.tipo_tributo = 'IPTU' GROUP BY c.nome;
Revelar gabarito e comentário▾
GabaritoC — SELECT c.nome, SUM(d.valor) AS total_debitos FROM contribuinte c JOIN debitos d ON c.id = d.contribuinte_id WHERE c.situacao = 'ATIVO' AND d.tipo_tributo = 'IPTU' AND d.data_vencimento < CURRENT_DATE GROUP BY c.nome;
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”.
Consultas SQL: JOIN, agregação e filtros
Gabarito: letra C. A consulta correta deve unir as tabelas contribuinte e debitos pela chave estrangeira (c.id = d.contribuinte_id), filtrar os contribuintes ativos, os débitos do tipo IPTU e os vencidos (data_vencimento < CURRENT_DATE), e então agrupar por nome para somar os valores com SUM(d.valor). A alternativa C é a única que combina todos esses elementos corretamente.
O problema pede uma consulta que envolve duas tabelas relacionadas: contribuinte e debitos. A relação entre elas é feita pela coluna contribuinte_id na tabela de débitos, que referencia a coluna id na tabela de contribuintes. Para combinar os dados das duas tabelas, usamos um JOIN. Como queremos apenas contribuintes que possuem débitos (e não todos os contribuintes), o INNER JOIN é o mais adequado — ele retorna apenas as linhas onde há correspondência nas duas tabelas.
O requisito pede três filtros: contribuinte ativo (situacao = 'ATIVO'), débito do tipo IPTU (tipo_tributo = 'IPTU') e débito vencido (data_vencimento < CURRENT_DATE). Esses filtros devem ser aplicados na cláusula WHERE, que restringe as linhas retornadas antes da agregação. Depois de filtrar, precisamos agrupar os resultados por contribuinte para somar os valores dos débitos de cada um — isso é feito com GROUP BY c.nome e SUM(d.valor).
A pegadinha clássica dessa questão é a condição de junção. Na alternativa A, o JOIN é feito com ON c.id = d.id, o que está errado — a coluna id na tabela debitos é a chave primária da própria tabela, não a chave estrangeira que referencia o contribuinte. A coluna correta é d.contribuinte_id. Outra pegadinha é esquecer o filtro de vencimento ou de tipo de tributo, ou aplicar o filtro de tipo no HAVING em vez do WHERE (o que não funciona, pois HAVING é para filtrar grupos, não linhas individuais).
Guarde a estrutura: JOIN com a condição correta → WHERE com todos os filtros → GROUP BY para agrupar → SUM para agregar. É exatamente essa sequência que separa a alternativa correta das demais.
Critério
Alternativa A
Alternativa B
Alternativa C (✅)
Alternativa D
Alternativa E
Condição de JOIN
c.id = d.id (errada)
c.id = d.contribuinte_id (correta)
c.id = d.contribuinte_id (correta)
c.id = d.contribuinte_id (correta)
Sem JOIN (errada)
Filtro situação = 'ATIVO'
✅ Presente
✅ Presente
✅ Presente
✅ Presente
✅ Presente
Filtro tipo_tributo = 'IPTU'
✅ No WHERE
❌ No HAVING (inválido)
✅ No WHERE
❌ Ausente
✅ No WHERE (mas sem tabela)
Filtro vencimento
✅ < CURRENT_DATE
❌ Ausente
✅ < CURRENT_DATE
✅ < CURRENT_DATE
❌ Ausente
Agregação
✅ SUM(d.valor) + GROUP BY c.nome
✅ SUM(valor) + GROUP BY nome
✅ SUM(d.valor) + GROUP BY c.nome
❌ Sem agregação
✅ SUM(d.valor) + GROUP BY c.nome
Resultado
❌ JOIN incorreto
❌ Filtros incorretos
✅ Atende todos os requisitos
❌ Sem total por contribuinte
❌ Erro de sintaxe (tabela ausente)
Alternativa A — ❌ Incorreta
O erro está na condição do JOIN: ON c.id = d.id. A coluna id na tabela debitos é a chave primária da própria tabela, não a chave estrangeira que referencia o contribuinte. A condição correta deveria ser ON c.id = d.contribuinte_id. Sem essa correção, a junção não relaciona os débitos aos seus respectivos contribuintes, produzindo um resultado incorreto.
Alternativa B — ❌ Incorreta
Esta alternativa usa LEFT JOIN, que retornaria todos os contribuintes, mesmo os sem débitos — mas o requisito pede apenas contribuintes com débitos vencidos de IPTU. Além disso, o filtro tipo_tributo = 'IPTU' está na cláusula HAVING, que é aplicada após o agrupamento e serve para filtrar grupos, não linhas individuais. Como tipo_tributo não é uma coluna agregada nem está no GROUP BY, essa cláusula é inválida. O filtro deveria estar no WHERE. Também falta o filtro de vencimento (data_vencimento < CURRENT_DATE).
Alternativa C — ✅ Correta ⟵ GABARITO
Esta é a consulta correta. Ela faz o JOIN com a condição certa (c.id = d.contribuinte_id), aplica todos os filtros no WHERE (contribuinte ativo, débito IPTU e débito vencido), agrupa por nome e soma os valores com SUM(d.valor). A ordem das operações está correta: primeiro filtra as linhas, depois agrupa e agrega.
Alternativa D — ❌ Incorreta
Esta alternativa não usa SUM(d.valor) nem GROUP BY. Ela retorna uma linha para cada débito individual (coluna valor sem agregação), não o valor total por contribuinte. Além disso, falta o filtro tipo_tributo = 'IPTU' — ela considera todos os tipos de tributo, não apenas IPTU.
Alternativa E — ❌ Incorreta
Esta alternativa não faz o JOIN com a tabela debitos. Ela referencia a coluna d.tipo_tributo na cláusula WHERE, mas a tabela debitos não está na cláusula FROM — apenas contribuinte c. Isso gera um erro de sintaxe, pois a coluna d.tipo_tributo não existe no escopo da consulta. Para referenciar colunas da tabela debitos, é necessário incluí-la no FROM com um JOIN.