ADR-0009 · COALESCE en GROUP BY para coherencia de totales

ADR-0009 · COALESCE en GROUP BY para coherencia de totales

Contexto

Después de ADR-0001, los NDCONs entran en Vta pero no en el margen.

Nuevo problema: las queries que agrupan por proveedor / supervisor / cliente / artículo filtraban IS NOT NULL en el campo de agrupación. Los NDCONs (que tienen esos campos en NULL) se perdían → el TOTAL de cada tab no coincidía con el TOTAL del Resumen Ejecutivo.

Ejemplo del problema (Abril 2026)

Vista Total ¿Coherente?
KPI "Ventas Netas" del Resumen Ejecutivo $591.208.375 ★ Referencia
Tab Por Vendedor (sin filtro IS NOT NULL) $591.208.375
Tab Por Artículo (con WHERE dsArticulo IS NOT NULL) $590.971.735 ❌ −$236.640
Tab Por Proveedor (con WHERE proveedor IS NOT NULL) $590.971.735 ❌ idem

La diferencia ($236.640) son los NDCONs sin artículo/proveedor.

Decisión

Eliminar el filtro IS NOT NULL del WHERE. Reemplazarlo por COALESCE en GROUP BY para etiquetar los NULLs como (SIN ARTÍCULO) / (SIN PROVEEDOR) / etc.

Patrón estándar

SELECT COALESCE(NULLIF(TRIM(<campo>),''), '(SIN <ETIQUETA>)') AS <alias>,
       SUM(subtotalNeto) AS ventas,
       SUM_VENTAS_REALES AS ventas_reales,
       SUM_COSTO_NETO    AS costo,
       EXPR_CONTRIBUCION AS contribucion,
       EXPR_MARGEN_PCT   AS margen,
       ...
FROM ventas LEFT JOIN articulos_raw a ON ...
WHERE sync_id=? AND anulado='NO'           -- ★ SIN filtro IS NOT NULL
GROUP BY <alias>
ORDER BY ventas DESC;

Funciones afectadas

Función Campo agrupador Etiqueta para NULL
_apiMargenArticulos dsArticulo (SIN ARTÍCULO)
_apiMargenProveedores proveedor N/D
_apiMargenClientes nombreCliente N/D
_apiProvSup proveedor, dsSupervisor (SIN PROVEEDOR), (SIN SUPERVISOR)
_apiProvDep proveedor, dsDeposito (SIN PROVEEDOR), (SIN DEPÓSITO)

Consecuencias

Resultado (Abril 2026)

Vista Total
KPI "Ventas Netas" del Resumen Ejecutivo $591.208.375
Tab Por Vendedor $591.208.375 ✅
Tab Por Supervisor $591.208.375 ✅
Tab Por Depósito $591.208.375 ✅
Tab Por Cliente $591.208.375 ✅
Tab Por Artículo $591.208.375 ✅ (incluye fila (SIN ARTÍCULO) con $236.640)
Tab Por Proveedor $591.208.375 ✅
Resumen Proveedor × Supervisor $591.208.375 ✅
Resumen Proveedor × Depósito $591.208.375 ✅

Todos los tabs coherentes al peso. ✅ La fila (SIN ARTÍCULO) es informativa — muestra cuánto pesan los movimientos financieros. ⚠️ La fila aparece visualmente en las tablas (no se puede ocultar sin perder coherencia).

Alternativa rechazada

Filtrar IS NOT NULL y agregar un "ajuste" al final:

  • ❌ Confuso para el lector.
  • ❌ Requiere una fila especial en cada tabla.
  • ❌ No es el patrón de ChessERP.

Referencias