Google Analytics 2027 · Capítulo 31 de 35 · 11 min
SQL para Analytics: avaliar consultas que juntam Analytics, loja e CRM
Uma consulta SQL pode responder à pergunta certa com a contagem errada. O capítulo ensina a reconhecer a unidade de cada tabela, a pedir a prova de que a junção não multiplicou linhas e a ler a conciliação entre Analytics e loja.
Este capítulo faz parte do curso gratuito Google Analytics 2027.
Quando a equipe entrega uma consulta sobre a exportação do Analytics, o executivo raramente vai ler o código. Ele precisa saber três coisas: que pergunta a consulta responde, em que unidade ela conta (evento, sessão, pedido, cliente) e que prova mostra que nenhum total foi inflado no caminho. Este capítulo trata dessas três coisas, com o código da Verde Vivo, a loja fictícia do curso, mostrado para quem quiser acompanhar.
Cada linha da exportação é um evento, e o resto se reconstrói
Na tabela exportada, cada linha é um evento: uma página vista, um item no carrinho, uma compra. A sessão não existe como linha; ela é montada juntando os eventos que têm o mesmo identificador de navegador e o mesmo número de sessão. Os detalhes de cada evento ficam guardados em listas dentro da linha, como gavetas numa caixa: a lista de parâmetros (endereço da página, número da sessão) e a lista de itens comprados. Para usar um parâmetro, a consulta abre a gaveta com a operação UNNEST, que transforma cada elemento da lista numa linha; a equipe precisa controlar essa expansão para não repetir valores na soma.
Um cuidado aparece logo na primeira consulta. A exportação tem três registros com origem de tráfego: a origem coletada em cada evento, a origem da sessão e a origem da primeira visita. Os dois últimos são os que mais confundem. O registro traffic_source guarda a origem que trouxe a pessoa pela primeira vez e não muda depois. O registro session_traffic_source_last_click guarda a origem da sessão, pela regra do último clique. Uma consulta que pretende mostrar “de onde vieram as compras desta semana” e usa traffic_source está contando a primeira visita de cada cliente, talvez de anos atrás.

Ver como texto
Esquema do BigQuery Export na ajuda do Google Analytics com o registro traffic_source aberto, descrito como a origem que adquiriu o usuário pela primeira vez, ao lado dos registros collected_traffic_source e session_traffic_source_last_click
O exemplo técnico abaixo lista, para uma semana, cada página vista e cada compra, com o número da sessão e a origem da sessão. O filtro pelo final do nome da tabela (_TABLE_SUFFIX) limita a leitura aos sete dias pedidos; sem ele, o BigQuery leria todo o histórico e cobraria por isso.
-- Página, sessão e origem da sessão de cada evento, numa semana
SELECT
event_date,
event_name,
user_pseudo_id,
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'page_location') AS pagina,
(SELECT value.int_value FROM UNNEST(event_params)
WHERE key = 'ga_session_id') AS numero_da_sessao,
session_traffic_source_last_click.cross_channel_campaign.source AS origem_da_sessao,
session_traffic_source_last_click.cross_channel_campaign.medium AS midia_da_sessao
FROM `projeto.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260907'
AND event_name IN ('page_view', 'purchase');Itens e pedidos repetidos inflam a receita sem aviso
A multiplicação de linhas numa junção já apareceu em Data Studio (antigo Looker Studio): o relatório mensal que junta fontes; aqui os dois riscos novos são a expansão dos itens e a repetição do mesmo pedido. Pense em três pedidos da semana. O pedido 101 teve um item; o 102, três itens; o 103 foi registrado duas vezes porque o servidor reenviou a compra depois de uma resposta perdida. Se a consulta abre a lista de itens antes de somar a receita do pedido, o 102 aparece três vezes. Se não trata a repetição, o 103 aparece duas. A receita sai inflada, e a consulta roda sem nenhum aviso.
| Forma de contar | Linhas | Pedidos contados | Receita somada | Certo? |
|---|---|---|---|---|
| Uma linha por pedido, repetição removida | 3 | 3 | R$ 645 | Sim |
| Uma linha por evento de compra, sem remover repetição | 4 | 4 | R$ 860 | Não: o 103 conta duas vezes |
| Uma linha por item, somando a receita do pedido | 6 | 6 | R$ 1.290 | Não: o 102 conta três vezes e o 103 duas |
A prova que o executivo deve pedir: o número de pedidos e a receita depois da consulta, comparados com a contagem simples de pedidos únicos no mesmo período.
Contar pedidos distintos protege a contagem e não protege a soma. A versão anterior da consulta da Verde Vivo usava COUNT(DISTINCT), a operação que conta cada número de pedido uma única vez, para os pedidos e somava a receita de todas as linhas, e o pedido repetido entrava duas vezes no dinheiro. A versão corrigida escolhe primeiro uma linha por pedido (a primeira compra registrada com aquele número) e só depois soma. Antes disso, uma consulta de apoio lista os números repetidos com valores ou itens diferentes entre si, que vão para investigação em vez de serem resolvidos pela regra, e as compras sem número válido são contadas à parte.
-- Pedidos e receita por origem da sessão, com uma linha por pedido antes de somar
WITH compras AS (
SELECT
ecommerce.transaction_id AS pedido,
session_traffic_source_last_click.cross_channel_campaign.source AS origem,
session_traffic_source_last_click.cross_channel_campaign.medium AS midia,
ecommerce.purchase_revenue AS receita,
event_timestamp
FROM `projeto.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260930'
AND event_name = 'purchase'
AND ecommerce.transaction_id IS NOT NULL
AND ecommerce.transaction_id NOT IN ('', '(not set)')
),
um_por_pedido AS (
SELECT * FROM compras
WHERE TRUE
QUALIFY ROW_NUMBER() OVER (PARTITION BY pedido ORDER BY event_timestamp) = 1
)
SELECT origem, midia, COUNT(*) AS pedidos, SUM(receita) AS receita
FROM um_por_pedido
GROUP BY origem, midia
ORDER BY receita DESC;A mesma lógica vale para o CRM. Um lead gera dezenas de eventos no Analytics e uma linha no HubSpot. Juntar as duas tabelas evento a evento multiplica cada contrato por dezenas. A consulta certa resume o Analytics em uma linha por lead e só depois junta uma linha com uma linha. A defesa contra o erro é contar as linhas antes e depois de cada junção: se o total mudou, investigue registros duplicados ou excluídos pela junção, e a equipe explica toda diferença.
A conciliação com a loja classifica cada pedido
A consulta mais útil da Verde Vivo junta as compras do Analytics com os pedidos pagos da loja pelo número do pedido e coloca cada pedido em um de três grupos: está nos dois, só na loja, só no Analytics. Em agosto de 2026, ela encontrou 1.390 compras no Analytics para 1.650 pedidos pagos na loja. Os 260 pedidos só na loja vinham sobretudo de quem recusou a medição no banner. Foi uma conciliação igual, em maio, que revelou os pagamentos por Pix confirmados depois que a pessoa fechava a aba, caso resolvido em Server-side e Measurement Protocol: medir pagamentos fora do site.
Com a compra enviada pelo servidor, os grupos separam lacuna esperada de defeito. “Só na loja” tem uma causa esperada, a recusa de medição no banner, e causas de defeito, como pedido parado na fila ou sem identificador. “Só no Analytics” pede investigação de compras de teste, identificadores incorretos, diferenças de período ou registros ausentes na extração da loja; reenvios com o mesmo número são detectados antes da junção. A consulta separa os grupos; a explicação vem de olhar alguns pedidos de cada um, pela forma de pagamento e pela data.
- Etapa 1 de 5: Tabela diária bruta
Gravada pelo Google; ninguém edita
- Etapa 2 de 5: Tabela preparada de eventos
Consulta agendada abre os parâmetros uma vez por dia, depois da tabela ficar estável
- Etapa 3 de 5: Sessões
Uma linha por sessão, com origem e se houve compra
- Etapa 4 de 5: Pedidos conciliados
Compras do Analytics ao lado dos pedidos pagos da loja, uma linha por pedido
- Etapa 5 de 5: Relatório
O Data Studio lê só as tabelas pequenas
Ver como texto
- Tabela diária bruta: Gravada pelo Google; ninguém edita
- Tabela preparada de eventos: Consulta agendada abre os parâmetros uma vez por dia, depois da tabela ficar estável
- Sessões: Uma linha por sessão, com origem e se houve compra
- Pedidos conciliados: Compras do Analytics ao lado dos pedidos pagos da loja, uma linha por pedido
- Relatório: O Data Studio lê só as tabelas pequenas
O custo da consulta depende de quantos dados ela lê
No modelo sob demanda, o BigQuery cobra pelos bytes lidos; no modelo por capacidade, pelos slots (unidades de processamento) contratados. O volume estimado aparece antes da execução, e a consulta gera cobrança conforme o modelo contratado. Quatro hábitos mantêm a conta baixa: filtrar sempre pelo final do nome da tabela, pedir só as colunas necessárias, criar tabelas intermediárias com os parâmetros já abertos e olhar a estimativa de volume antes de rodar. Na Verde Vivo, a tabela preparada diária, com uma linha por evento e os parâmetros necessários em colunas, reduziu a leitura de cada atualização do relatório de cerca de 38 GB para 2 GB.

Ver como texto
Documentação do Google Cloud, Estimar e controlar custos do BigQuery, na seção Verificar o custo estimado antes de executar uma consulta, explicando que no modelo sob demanda as consultas são cobradas pelos bytes lidos
A coorte é a pergunta que a exportação responde melhor que a interface, porque o prazo de armazenamento é definido no BigQuery e pode passar de 14 meses, desde que a política de expiração e o orçamento permitam. Até janeiro de 2026, as compras da loja iam para outra propriedade, criada pelo plugin da Shopify, e não estão na exportação. Por isso a consulta da Verde Vivo juntou o histórico de pedidos da Shopify, carregado no BigQuery, à exportação do site: 31% de quem fez a primeira compra em setembro de 2025, segundo o cadastro da loja, voltou a comprar nos 12 meses seguintes. A exportação entra para ler o que esses clientes fizeram no site.
Consulta no BigQuery e consulta pela API respondem de jeitos diferentes
Às vezes a equipe compara o resultado do SQL com um número tirado da Data API, a porta pela qual programas pedem relatórios ao Analytics. Os dois diferem pelos mesmos motivos que separam interface e exportação, e a ajuda oficial tem uma tabela que lista essas diferenças. Desde 14 de setembro de 2026, as respostas da Data API trazem um campo que avisa quando o relatório foi cortado por limite (dataTruncationReasons), com o tipo de corte e as datas afetadas. A exportação não traz esse campo; os limites dela são outros, como o teto de 1 milhão de eventos por dia na exportação diária da propriedade padrão.

Ver como texto
Página Comparação das plataformas de relatórios na ajuda do Google Analytics, com tabela que compara relatórios, Data API e BigQuery por metodologia de acesso e escopo dos dados
Para a próxima consulta que chegar à sua mesa, peça três coisas junto do resultado: a frase da pergunta que ela responde, a unidade de cada linha e a comparação entre o total antes e depois de cada junção. Se a consulta concilia Analytics e loja, peça também a contagem dos três grupos e cinco exemplos de cada um. Essas verificações permitem avaliar o resultado sem revisar todo o código.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- SQL para quem decide: o que pedir ao banco e ao timesugerido pelo grafoApresenta os conceitos “BigQuery” e “SQL”, usados em “SQL para Analytics: avaliar consultas que juntam Analytics, loja e CRM”.
- CursoDados com Pythonsugerido pelo grafo5 capítulos de “Google Analytics 2027” usam conceitos apresentados em “Dados com Python”.
Depois, siga para
- CursoGoogle Ads 2027sugerido pelo grafo7 capítulos de “Google Ads 2027” usam conceitos apresentados em “Google Analytics 2027”.
- CursoMeta Ads 2027sugerido pelo grafo5 capítulos de “Meta Ads 2027” usam conceitos apresentados em “Google Analytics 2027”.
- CursoCRO: Otimização de Conversão e Experimentaçãosugerido pelo grafo2 capítulos de “CRO: Otimização de Conversão e Experimentação” usam conceitos apresentados em “Google Analytics 2027”.
- CursoVibecoding para SEOsugerido pelo grafo2 capítulos de “Vibecoding para SEO” usam conceitos apresentados em “Google Analytics 2027”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Analytics de buscaComeçar pela pergunta de negócioExaminar conexões de Começar pela pergunta de negócio
- Dados com PythonSQL para quem decide: o que pedir ao banco e ao timeExaminar conexões de SQL para quem decide: o que pedir ao banco e ao time
- SEO e GEO para Pet e AgroMedir e melhorar: escolha um número e uma açãoExaminar conexões de Medir e melhorar: escolha um número e uma ação
Terminou a leitura?
Você está aqui: capítulo 31 de 35
0 de 35 concluídos
- Próximo · Capítulo 32 de 35 · 10 minAPIs do Analytics: automatizar leituras e alertas com acesso controladoLer o capítulo 32 sem concluir
Marque como concluído para o capítulo contar no seu painel e no certificado.
- Anterior · Capítulo 30 de 35 · 11 minExportação para o BigQuery: analisar os eventos brutos fora do GA4Voltar para o capítulo 30
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Capítulos vizinhos em Google Analytics 2027
- 29Server-side e Measurement Protocol: medir pagamentos fora do site
- 30Exportação para o BigQuery: analisar os eventos brutos fora do GA4
- 31SQL para Analytics: avaliar consultas que juntam Analytics, loja e CRM
- 32APIs do Analytics: automatizar leituras e alertas com acesso controlado
- 33Analytics 360 e governança: quando a versão paga compensa