Combinar pedidos actuales e históricos

Situación

Los pedidos recientes permanecen en Pedido y PedidoDetalle; los antiguos fueron resumidos en PedidoHistorico. Queremos una cronología única sin ocultar de dónde procede cada fila.

Primera aproximación

UNION podría combinar los resultados, pero además intentaría eliminar duplicados. Como cada pedido pertenece a una fuente conocida y queremos conservar todas las filas, utilizaremos UNION ALL.

Los pedidos actuales todavía tienen varias partidas. Una CTE —la consulta con nombre que comienza mediante WITH— permitirá resumirlas primero con SUM y utilizar después ese resultado como si fuera una tabla dentro de la misma instrucción.

Consulta final

WITH PedidosActuales AS
(
    SELECT
        pe.IdPedido,
        pe.IdCliente,
        pe.FechaPedido,
        pe.Estado,
        SUM
        (
            d.Cantidad * d.PrecioUnitario
            * (1 - d.Descuento / 100.0)
        ) AS Total
    FROM dbo.Pedido AS pe
    INNER JOIN dbo.PedidoDetalle AS d
        ON d.IdPedido = pe.IdPedido
    GROUP BY
        pe.IdPedido,
        pe.IdCliente,
        pe.FechaPedido,
        pe.Estado
)
SELECT
    a.IdPedido,
    a.IdCliente,
    a.FechaPedido,
    a.Estado,
    a.Total,
    'Actual' AS Origen
FROM PedidosActuales AS a

UNION ALL

SELECT
    h.IdPedidoOriginal AS IdPedido,
    h.IdCliente,
    h.FechaPedido,
    h.Estado,
    h.Total,
    'Histórico' AS Origen
FROM dbo.PedidoHistorico AS h
ORDER BY
    FechaPedido DESC,
    IdPedido DESC,
    Origen;

Recorrido

La CTE calcula primero el total actual a partir de sus partidas. La consulta histórica ya contiene una fila resumida por pedido, por lo que no necesita agrupar.

Ambos lados devuelven seis columnas compatibles y en el mismo orden. La columna calculada Origen conserva trazabilidad —la posibilidad de reconocer de dónde procede cada fila— y ayuda a interpretar identificadores que provienen de espacios distintos.

El ORDER BY aparece una sola vez al final y organiza el conjunto combinado. Origen actúa como último desempate cuando dos fuentes contienen el mismo identificador y fecha.

Resultado esperado

Las primeras filas de marzo provienen de Actual; después aparecen pedidos de 2025 con origen Histórico. Ninguna fila se elimina por parecerse a otra.

IdPedido FechaPedido Total Origen
5 2026-03-05 08:50 624.15 Actual
2 2026-03-04 17:20 719.10 Actual
9003 2025-10-22 18:45 219.00 Histórico

Comprobación en SSMS

La cronología reúne ambos orígenes y mantiene la etiqueta que permite distinguir cada fila.

Resultado real en SSMS de pedidos actuales e históricos

Variación: filtrar después de combinar

Si necesitamos aplicar un mismo filtro a ambos orígenes, envolvemos el UNION ALL en una CTE adicional y filtramos una vez. Esto evita mantener condiciones equivalentes en dos lugares.

Límite o precaución

Compatibilidad de tipos no significa igualdad de significado. Confirmamos moneda, reglas de descuento, precisión, zona horaria y significado de los estados en ambos periodos.

También comprobamos si los identificadores históricos pueden coincidir con los actuales. La columna Origen puede formar parte de la llave lógica del resultado, el conjunto de valores que distingue cada entidad dentro de esta combinación.

UNION ALL conserva incluso una fila que haya quedado por error tanto en la tabla actual como en la histórica. Antes de combinar definimos el punto de corte entre ambas fuentes y comprobamos que no exista traslape; la etiqueta Origen permite detectar y explicar esas coincidencias, pero no las corrige.

Relacionado con

Índice del recorrido

Casos aplicados

10 artículos de Casos aplicados
  1. 01Consultar clientes con sus pedidos confirmados
  2. 02Encontrar clientes que todavía no tienen pedidos
  3. 03Mostrar el primer teléfono disponible de cada cliente
  4. 04Obtener ventas totales por cliente y filtrar las más altas
  5. 05Insertar un pedido y sus partidas de forma segura
  6. 06Actualizar precios de una categoría con validación previa
  7. 07Combinar pedidos actuales e históricos
  8. 08Obtener el último pedido de cada cliente
  9. 09Calcular venta diaria y total acumulado
  10. 10Construir una búsqueda paginada con filtros opcionales