Pular para o conteúdo principal

Aggregate Node

O Aggregate Node é uma ferramenta poderosa do n8n para agrupar e agregar dados. Ele permite calcular estatísticas, somar valores, contar itens e criar resumos baseados em critérios específicos.

O que é o Aggregate Node?

O Aggregate Node permite:

  • Agrupar dados por campos específicos
  • Calcular estatísticas (soma, média, contagem)
  • Criar resumos de dados
  • Consolidar informações de múltiplos itens
  • Gerar relatórios agregados
  • Reduzir volume de dados

Quando Usar o Aggregate Node

  • Relatórios de vendas por período
  • Estatísticas de usuários por categoria
  • Consolidação de dados de múltiplas fontes
  • Análise de performance por região
  • Resumos de transações financeiras
  • Agregação de métricas de negócio

Configuração Básica

Estrutura do Aggregate Node

// Aggregate Node - Estrutura básica
{
  "groupBy": ["categoria", "regiao"], // Campos para agrupar
  "aggregations": [
    {
      "field": "valor",
      "operation": "sum",
      "name": "total_valor"
    },
    {
      "field": "id",
      "operation": "count",
      "name": "quantidade_itens"
    }
  ]
}

Campos de Agrupamento

1. Agrupamento Simples

// Agrupar por um campo
{
  "groupBy": ["categoria"]
}

// Agrupar por múltiplos campos
{
  "groupBy": ["categoria", "regiao", "mes"]
}

2. Agrupamento com Expressões

// Agrupar por data formatada
{
  "groupBy": ["{{ $json.data.substring(0, 7) }}"] // YYYY-MM
}

// Agrupar por faixa de valor
{
  "groupBy": ["{{ $json.valor > 1000 ? 'Alto' : 'Baixo' }}"]
}

// Agrupar por categoria condicional
{
  "groupBy": ["{{ $json.categoria || 'Sem Categoria' }}"]
}

Operações de Agregação

1. Soma (Sum)

// Somar valores numéricos
{
  "field": "valor",
  "operation": "sum",
  "name": "total_vendas"
}

// Somar com condição
{
  "field": "{{ $json.status === 'aprovado' ? $json.valor : 0 }}",
  "operation": "sum",
  "name": "total_aprovado"
}

2. Contagem (Count)

// Contar todos os itens
{
  "field": "id",
  "operation": "count",
  "name": "total_registros"
}

// Contar com condição
{
  "field": "{{ $json.ativo ? 1 : 0 }}",
  "operation": "sum",
  "name": "registros_ativos"
}

3. Média (Average)

// Calcular média
{
  "field": "valor",
  "operation": "average",
  "name": "valor_medio"
}

// Média com filtro
{
  "field": "{{ $json.valor > 0 ? $json.valor : null }}",
  "operation": "average",
  "name": "media_valores_positivos"
}

4. Mínimo e Máximo

// Valor mínimo
{
  "field": "valor",
  "operation": "min",
  "name": "valor_minimo"
}

// Valor máximo
{
  "field": "valor",
  "operation": "max",
  "name": "valor_maximo"
}

5. Primeiro e Último

// Primeiro valor
{
  "field": "nome",
  "operation": "first",
  "name": "primeiro_nome"
}

// Último valor
{
  "field": "data",
  "operation": "last",
  "name": "ultima_data"
}

Exemplos Práticos

1. Relatório de Vendas por Categoria

// Aggregate Node - Vendas por categoria
{
  "groupBy": ["categoria"],
  "aggregations": [
    {
      "field": "valor",
      "operation": "sum",
      "name": "total_vendas"
    },
    {
      "field": "id",
      "operation": "count",
      "name": "quantidade_vendas"
    },
    {
      "field": "valor",
      "operation": "average",
      "name": "ticket_medio"
    },
    {
      "field": "valor",
      "operation": "min",
      "name": "menor_venda"
    },
    {
      "field": "valor",
      "operation": "max",
      "name": "maior_venda"
    }
  ]
}

Resultado:

[
  {
    "categoria": "Eletrônicos",
    "total_vendas": 15000,
    "quantidade_vendas": 25,
    "ticket_medio": 600,
    "menor_venda": 100,
    "maior_venda": 2000
  },
  {
    "categoria": "Roupas",
    "total_vendas": 8000,
    "quantidade_vendas": 40,
    "ticket_medio": 200,
    "menor_venda": 50,
    "maior_venda": 500
  }
]

2. Estatísticas de Usuários por Região

// Aggregate Node - Usuários por região
{
  "groupBy": ["regiao", "status"],
  "aggregations": [
    {
      "field": "id",
      "operation": "count",
      "name": "total_usuarios"
    },
    {
      "field": "{{ $json.ativo ? 1 : 0 }}",
      "operation": "sum",
      "name": "usuarios_ativos"
    },
    {
      "field": "data_cadastro",
      "operation": "first",
      "name": "primeiro_cadastro"
    },
    {
      "field": "data_cadastro",
      "operation": "last",
      "name": "ultimo_cadastro"
    }
  ]
}

3. Análise de Performance por Período

// Aggregate Node - Performance por mês
{
  "groupBy": ["{{ $json.data.substring(0, 7) }}"],
  "aggregations": [
    {
      "field": "vendas",
      "operation": "sum",
      "name": "total_vendas_mes"
    },
    {
      "field": "clientes",
      "operation": "count",
      "name": "novos_clientes"
    },
    {
      "field": "receita",
      "operation": "sum",
      "name": "receita_total"
    },
    {
      "field": "custo",
      "operation": "sum",
      "name": "custo_total"
    },
    {
      "field": "{{ $json.receita - $json.custo }}",
      "operation": "sum",
      "name": "lucro_mes"
    }
  ]
}

4. Consolidação de Dados de Múltiplas Fontes

// Aggregate Node - Consolidação de dados
{
  "groupBy": ["produto_id", "fornecedor"],
  "aggregations": [
    {
      "field": "quantidade",
      "operation": "sum",
      "name": "estoque_total"
    },
    {
      "field": "valor_unitario",
      "operation": "average",
      "name": "preco_medio"
    },
    {
      "field": "data_entrada",
      "operation": "last",
      "name": "ultima_entrada"
    },
    {
      "field": "id",
      "operation": "count",
      "name": "numero_entradas"
    }
  ]
}

5. Análise de Transações Financeiras

// Aggregate Node - Análise financeira
{
  "groupBy": ["tipo_transacao", "{{ $json.data.substring(0, 10) }}"],
  "aggregations": [
    {
      "field": "{{ $json.tipo === 'credito' ? $json.valor : 0 }}",
      "operation": "sum",
      "name": "total_creditos"
    },
    {
      "field": "{{ $json.tipo === 'debito' ? $json.valor : 0 }}",
      "operation": "sum",
      "name": "total_debitos"
    },
    {
      "field": "id",
      "operation": "count",
      "name": "numero_transacoes"
    },
    {
      "field": "{{ $json.tipo === 'credito' ? $json.valor : -$json.valor }}",
      "operation": "sum",
      "name": "saldo_dia"
    }
  ]
}

Casos de Uso Avançados

1. Agregação com Condições Complexas

// Aggregate Node - Condições complexas
{
  "groupBy": ["categoria", "{{ $json.valor > 1000 ? 'Premium' : 'Standard' }}"],
  "aggregations": [
    {
      "field": "{{ $json.status === 'aprovado' ? $json.valor : 0 }}",
      "operation": "sum",
      "name": "vendas_aprovadas"
    },
    {
      "field": "{{ $json.status === 'pendente' ? $json.valor : 0 }}",
      "operation": "sum",
      "name": "vendas_pendentes"
    },
    {
      "field": "{{ $json.status === 'cancelado' ? $json.valor : 0 }}",
      "operation": "sum",
      "name": "vendas_canceladas"
    },
    {
      "field": "{{ $json.status === 'aprovado' ? 1 : 0 }}",
      "operation": "sum",
      "name": "quantidade_aprovadas"
    }
  ]
}

2. Agregação Temporal

// Aggregate Node - Agregação temporal
{
  "groupBy": [
    "{{ $json.data.substring(0, 4) }}", // Ano
    "{{ $json.data.substring(5, 7) }}", // Mês
    "{{ $json.data.substring(8, 10) }}" // Dia
  ],
  "aggregations": [
    {
      "field": "vendas",
      "operation": "sum",
      "name": "vendas_dia"
    },
    {
      "field": "clientes",
      "operation": "count",
      "name": "clientes_dia"
    },
    {
      "field": "{{ $json.vendas / $json.clientes }}",
      "operation": "average",
      "name": "ticket_medio_dia"
    }
  ]
}

3. Agregação Hierárquica

// Aggregate Node - Agregação hierárquica
{
  "groupBy": [
    "pais",
    "estado",
    "cidade",
    "bairro"
  ],
  "aggregations": [
    {
      "field": "vendas",
      "operation": "sum",
      "name": "vendas_local"
    },
    {
      "field": "clientes",
      "operation": "count",
      "name": "clientes_local"
    },
    {
      "field": "vendedor",
      "operation": "first",
      "name": "vendedor_responsavel"
    }
  ]
}

4. Agregação com Cálculos Personalizados

// Aggregate Node - Cálculos personalizados
{
  "groupBy": ["categoria"],
  "aggregations": [
    {
      "field": "valor",
      "operation": "sum",
      "name": "total_vendas"
    },
    {
      "field": "custo",
      "operation": "sum",
      "name": "total_custo"
    },
    {
      "field": "{{ $json.valor - $json.custo }}",
      "operation": "sum",
      "name": "lucro_bruto"
    },
    {
      "field": "{{ ($json.valor - $json.custo) / $json.valor * 100 }}",
      "operation": "average",
      "name": "margem_percentual"
    },
    {
      "field": "id",
      "operation": "count",
      "name": "quantidade_produtos"
    }
  ]
}

Boas Práticas

1. Escolha de Campos de Agrupamento

// ✅ Bom: Campos com valores limitados
{
  "groupBy": ["categoria", "status", "regiao"]
}

// ❌ Evitar: Campos com muitos valores únicos
{
  "groupBy": ["id", "email", "timestamp"]
}

2. Nomenclatura de Agregações

// ✅ Bom: Nomes descritivos
{
  "field": "valor",
  "operation": "sum",
  "name": "total_vendas_categoria"
}

// ❌ Evitar: Nomes genéricos
{
  "field": "valor",
  "operation": "sum",
  "name": "total"
}

3. Performance

// ✅ Bom: Agregações simples
{
  "field": "valor",
  "operation": "sum",
  "name": "total"
}

// ❌ Evitar: Cálculos complexos
{
  "field": "{{ $json.valor * Math.pow(1 + $json.taxa, $json.periodo) }}",
  "operation": "sum",
  "name": "valor_futuro"
}

4. Validação de Dados

// ✅ Bom: Validar dados antes de agregar
{
  "field": "{{ $json.valor && !isNaN($json.valor) ? $json.valor : 0 }}",
  "operation": "sum",
  "name": "total_valido"
}

// ❌ Evitar: Usar dados sem validação
{
  "field": "valor",
  "operation": "sum",
  "name": "total"
}

Troubleshooting

Problemas Comuns

Agregação retorna valores incorretos

  • Verifique se os campos existem
  • Confirme se os tipos de dados estão corretos
  • Teste com dados de exemplo
  • Use Debug Helper para ver dados

Performance lenta

  • Reduza o número de campos de agrupamento
  • Simplifique as expressões
  • Use agregações básicas
  • Considere filtrar dados antes

Campos de agrupamento não funcionam

  • Verifique se os campos têm valores
  • Confirme se as expressões estão corretas
  • Teste com agrupamento simples
  • Verifique se há valores nulos

Debug

// Code Node - Debug de Aggregate Node
const debugAggregate = (dados) => {
  console.log('=== DEBUG AGGREGATE ===');
  console.log('Dados de entrada:', dados);
  console.log('Campos disponíveis:', Object.keys(dados[0] || {}));
  console.log('Número de registros:', dados.length);
  console.log('Exemplo de registro:', dados[0]);
  console.log('========================');
  
  return dados;
};

// Usar antes do Aggregate Node
return { json: debugAggregate($json) };

Integração com Outros Nodes

1. Aggregate Node + Set Node

// Aggregate Node - Calcular estatísticas
{
  "groupBy": ["categoria"],
  "aggregations": [
    {
      "field": "valor",
      "operation": "sum",
      "name": "total"
    },
    {
      "field": "id",
      "operation": "count",
      "name": "quantidade"
    }
  ]
}

// Set Node - Adicionar cálculos adicionais
{
  "mode": "keepAllSet",
  "values": {
    "number": [
      {
        "name": "ticket_medio",
        "value": "{{ $json.total / $json.quantidade }}"
      },
      {
        "name": "percentual_total",
        "value": "{{ ($json.total / $('Aggregate Node').json.total_geral) * 100 }}"
      }
    ]
  }
}

2. Aggregate Node + If Node

// Aggregate Node - Agrupar por status
{
  "groupBy": ["status"],
  "aggregations": [
    {
      "field": "valor",
      "operation": "sum",
      "name": "total_por_status"
    }
  ]
}

// If Node - Processar por status
{
  "condition": "{{ $json.status === 'aprovado' }}",
  "true": "Processar Aprovados",
  "false": "Processar Outros"
}

Próximos Passos