Agrupamento/soma de dados em SQL

Tô trabalhando com uma tabela proveniente do IBGE, referente a uma amostra de pessoas do censo de 2000 e que tá organizada assim (entre outras colunas):

||   Control  ||    RendaTotal    ||    RendaFamiliar  ||
||      01     ||         12            ||                           ||
||      01     ||           2            ||                           ||
||      01     ||            0           ||                           ||
||      02     ||            5           ||                           ||
||      02     ||            0           ||                           ||

Onde a coluna “Control”, quando tem identificadores idênticos, quer dizer que as pessoas pertencem ao mesmo domicílio (possivelmente à mesma família, com algumas condições a mais).

A coluna “RendaTotal” é a renda mensal média, em salários mínimos.

A coluna “RendaFamiliar” é a que eu quero preencher, pra fazer uma análise de associação com outros atributos (estudo, nro de filhos, religião, etc).

O que eu preciso fazer, então, é selecionar todos os registros com Control igual, somar a RendaTotal deles, e colocar o resultado na coluna RendaFamiliar de cada um - no exemplo, todos os registros com Control “01” teriam RendaFamiliar = 14 e todos os registros com Control “02” teriam RendaFamiliar = 5.

Infelizmente, meus conhecimentos de SQL são realmente fracos… alguém pode ajudar?

OBS: A tabela está em Access :confused:

Eu diria que voce tem algumas opcoes :slight_smile: Primeiro, existe algum motivo para ter esta coluna “RendaFamiliar” na mesma tabela? Ter o resultado de uma soma (valor dinamico) como conteudo do banco de dados nem sempre eh uma boa opcao, e soh deve ser usado caso vc precise mesmo disso, geralmente por conta de performance. Caso vc ja tenha decidido ter este valor no banco de dados, pq nao te-lo em outra tabela? Assim, voce nao “duplica” o mesmo valor varias vezes (control = 01 teria o mesmo valor em RendaFamiliar para todos os 3 registros).

Se voce criar uma outra tabela, contendo apenas Control e RendaFamiliar (nome da tabela: RendaFamiliarTotal, neste exemplo), voce pode colocar o conteudo nesta tabela mais ou menos assim:

Mas caso queira manter o jeito que esta fazendo, eu acho que voce deve fazer um “script” para atualizar este campo. E para isso, voce de novo tem algumas alternativas (por exemplo, usando uma “stored procedure”, ou o equivalente, no Access), via Java (veja a documentacao sobre “batching” no Hibernate) ou outro jeito. Mas de qualquer forma, voce precisa fazer isso em duas etapas: 1) buscar os dados de forma agrupada, 2) atualizar os dados com a somatoria.

As queries seriam algo assim:

Entao, para cada registro que eh retornado, voce precisa atualizar o registro (update TABELA set RendaFamilar = where Control = )

Espero ter ajudado :slight_smile:

Na realidade, os valores tem de ficar todos na mesma tabela pois ela será utilizada para Data Mining no Weka… então ela nunca será atualizada, os valores só serão lidos, e fica muito mais rápido se não for necessário um join de tabelas durante a consulta (:

Então acabei fazendo da forma que você sugeriu:

INSERT INTO Temp([Control],[Renda]) 
            SELECT TabelaOrigem.Control, 
                         SUM(TabelaOrigem.RendaTotal) 
             FROM TabelaOrigem
             GROUP BY Control;

pra calcular os dados em outra tabela; e

UPDATE TabelaOrigem
INNER JOIN Temp
ON TabelaOrigem.Control = Temp.Control
SET TabelaOrigem.TotRendaFamilia = Temp.Renda;

pra mandar os dados calculados de volta.

Valeu!