Skip to content
On this page

📘 Modelo de Datos Curado para Marketing

SAP → BigQuery → Acoustic Connect
Documento Técnico Completo (Detalle Máximo, Desglose Campo por Campo)


🧠 Objetivo del documento

Este documento describe, con detalle exhaustivo, cómo se construyen todas las vistas del dataset curado mkt_curated, usado en el flujo:

SAP S/4HANA → Replicación Aercorsoft → BigQuery → Acoustic Connect

Incluye:

OrdenObjetoTipoPropósito
1customers_base_vVistaIdentidad, contacto y dirección del cliente
2customers_sales_vVistaOrganización comercial del cliente
3customers_finance_vVistaCondiciones de pago y baja lógica
4customers_behavior_fin_vVistaRecencia/Frecuencia/Valor en Cuentas por Cobrar (AR)
5customers_behavior_deliv_vVistaActividad logística (entregas)
6customer_consentTablaOpt-in / consentimiento
7acoustic_profiles_vVistaConsolidación final para Acoustic Connect

1️⃣ Vista fundacional: customers_base_v

Consolida identidad, contacto, dirección y fecha de alta de cada cliente SAP.

🔧 SQL

sql
CREATE OR REPLACE VIEW `minuto-verde-cortex-poc.mkt_curated.customers_base_v` AS
SELECT
  SAFE_CAST(k.kunnr AS STRING) AS customer_id,
  LOWER(TRIM(a6.smtp_addr))    AS email,
  TRIM(k.name1)                AS first_name,
  TRIM(k.name2)                AS last_name,
  TRIM(k.telf1)                AS phone,
  TRIM(addr.nation)            AS country,
  TRIM(addr.region)            AS region,
  TRIM(addr.city1)             AS city,
  TRIM(addr.street)            AS address,
  SAFE_CAST(k.erdat AS DATE)   AS created_at,
  IFNULL(k.sperr, '')          AS status_raw
FROM `minuto-verde-cortex-poc.CDC_SAP.kna1` k
LEFT JOIN `minuto-verde-cortex-poc.CDC_SAP.adr6` a6
  ON a6.addrnumber = k.adrnr
LEFT JOIN `minuto-verde-cortex-poc.CDC_SAP.adrc` addr
  ON addr.addrnumber = k.adrnr;

🧩 Explicación de limpieza y estructura (tabla extendida)

Campo generadoExpresión SQLTransformación aplicadaQué evita o mejoraUso final
customer_idSAFE_CAST(k.kunnr AS STRING)Convierte número SAP a texto seguroEvita truncamientos y problemas al comparar IDsLlave en todas las vistas posteriores
emailLOWER(TRIM(a6.smtp_addr))Elimina espacios + fuerza minúsculasEvita duplicados John@Mail.comjohn@mail.comLlave primaria en Acoustic
first_nameTRIM(k.name1)Quita espacios en excesoSAP guarda "JUAN "Personalización en campañas
last_nameTRIM(k.name2)LimpiezaPersonalización / razón social
phoneTRIM(k.telf1)LimpiezaEvita teléfonos ' +56  9 123 'Contacto / atributos de perfil
country/region/city/addressTRIM(addr.…)Limpieza generalEstándar para CRM / segmentaciónSegmentación geográfica
created_atSAFE_CAST(k.erdat AS DATE)Convierte entero SAP a DATEPermite análisis de recenciaAntigüedad del cliente
status_rawIFNULL(k.sperr, '')Reemplaza nulosEvita errores al exportarIndicador de bloqueo SAP

🧠 Por qué LEFT JOIN

Permite mantener clientes aunque no tengan email ni dirección.
Marketing prefiere registros visibles antes que perderlos.


2️⃣ Vista comercial: customers_sales_v

Expone la estructura comercial del cliente (canal, división, condición de precio).

🔧 SQL

sql
CREATE OR REPLACE VIEW `minuto-verde-cortex-poc.mkt_curated.customers_sales_v` AS
SELECT
  SAFE_CAST(kunnr AS STRING) AS customer_id,
  vkorg,
  vtweg,
  spart,
  kdgrp,
  konda
FROM `minuto-verde-cortex-poc.CDC_SAP.knvv`;

🧩 Tabla de explicación

Campo generadoFuente SAPQué significaUso en negocio
customer_idKUNNRID clienteLlave para unir con customers_base_v
vkorgVKORGOrganización de ventasPermite segmentación por unidad comercial
vtwegVTWEGCanal de distribuciónB2B / B2C / Online / Retail
spartSPARTDivisiónCategoría de negocio
kdgrpKDGRPGrupo de clientesSegmento comercial
kondaKONDACondiciones de precioDescuentos y pricing

3️⃣ Vista financiera: customers_finance_v

Define restricciones financieras (condiciones de pago, baja lógica).

🔧 SQL

sql
CREATE OR REPLACE VIEW `minuto-verde-cortex-poc.mkt_curated.customers_finance_v` AS
SELECT
  SAFE_CAST(kunnr AS STRING) AS customer_id,
  bukrs,
  zterm,
  loevm
FROM `minuto-verde-cortex-poc.CDC_SAP.knb1`;

🧩 Tabla de explicación

CampoFuente SAPSignificadoUso
customer_idKUNNRID clienteLlave
bukrsBUKRSSociedad / compañíaFiltrar operaciones por país/empresa
ztermZTERMCondiciones de pagoSegmentar por riesgo / antigüedad
loevmLOEVMBaja lógicaExcluir clientes inactivos

4️⃣ Vista de comportamiento financiero: customers_behavior_fin_v

Calcula Recencia / Frecuencia / Valor (RFM-like) sobre AR (Accounts Receivable).

🔧 SQL

sql
CREATE OR REPLACE VIEW `minuto-verde-cortex-poc.mkt_curated.customers_behavior_fin_v` AS
WITH ar AS (
  SELECT
    SAFE_CAST(bseg.kunnr AS STRING) AS customer_id,
    MAX(bkpf.budat) AS last_doc_date,
    COUNT(*) AS ar_postings,
    SUM(CAST(bseg.dmbtr AS NUMERIC)) AS total_amount_local
  FROM `minuto-verde-cortex-poc.CDC_SAP.bseg` bseg
  JOIN `minuto-verde-cortex-poc.CDC_SAP.bkpf` bkpf
    ON bkpf.bukrs = bseg.bukrs
   AND bkpf.gjahr = bseg.gjahr
   AND bkpf.belnr = bseg.belnr
  WHERE bseg.koart = 'D'
  GROUP BY customer_id
)
SELECT * FROM ar;
CampoQué representaUso marketing
last_doc_dateÚltima actividad financieraRecencia
ar_postingsCantidad de movimientosFrecuencia
total_amount_localAcumulado facturadoValor / LTV

5️⃣ Vista de comportamiento logístico: customers_behavior_deliv_v

Resume actividad de entregas reales al cliente.

🔧 SQL

sql
CREATE OR REPLACE VIEW `minuto-verde-cortex-poc.mkt_curated.customers_behavior_deliv_v` AS
WITH deliv AS (
  SELECT
    SAFE_CAST(likp.kunnr AS STRING) AS customer_id,
    MAX(likp.erdat) AS last_delivery_date,
    COUNT(DISTINCT likp.vbeln) AS deliveries_count
  FROM `minuto-verde-cortex-poc.CDC_SAP.likp`
  GROUP BY customer_id
)
SELECT * FROM deliv;
CampoQué representaUso
last_delivery_dateÚltima entregaRecencia logística
deliveries_countNúmero total de entregasFrecuencia de consumo

6️⃣ Tabla materializada: customer_consent

Opt-in / opt-out para contacto (no proviene de SAP).

sql
CREATE OR REPLACE TABLE `minuto-verde-cortex-poc.mkt_curated.customer_consent` (
  customer_id   STRING NOT NULL,
  consent_email BOOL NOT NULL,
  consent_date  TIMESTAMP,
  source_system STRING
);

7️⃣ Vista final consolidada: acoustic_profiles_v

Une todas las vistas previas + consentimiento.

sql
CREATE OR REPLACE VIEW `minuto-verde-cortex-poc.mkt_curated.acoustic_profiles_v` AS
SELECT
  b.email               AS Email,
  b.first_name          AS FirstName,
  b.last_name           AS LastName,
  b.customer_id         AS CustomerID,
  b.phone               AS Phone,
  b.country, b.region, b.city, b.address,
  b.created_at          AS CreatedAt,
  COALESCE(c.consent_email, FALSE) AS Consent,
  c.consent_date        AS ConsentDate,
  c.source_system       AS SourceSystem,
  f.last_doc_date       AS LastDocDate_AR,
  f.ar_postings         AS ARPostings,
  f.total_amount_local  AS TotalAmountLocal,
  d.last_delivery_date  AS LastDeliveryDate,
  d.deliveries_count    AS DeliveriesCount
FROM `...customers_base_v` b
LEFT JOIN `...customer_consent` c ON c.customer_id = b.customer_id
LEFT JOIN `...customers_behavior_fin_v` f ON f.customer_id = b.customer_id
LEFT JOIN `...customers_behavior_deliv_v` d ON d.customer_id = b.customer_id;

✅ Resumen Customer 360

Vista / TablaDimensión aportada
customers_base_vIdentidad + email + dirección
customers_sales_vOrganización comercial
customers_finance_vPostura financiera
customers_behavior_fin_vRecencia/Frecuencia/Valor
customers_behavior_deliv_vLogística (entregas)
customer_consentOpt-in / privacidad
acoustic_profiles_vExportación final a Acoustic