es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo combinar información de una tabla principal y una tabla de registros en SQL Server

Actualmente tengo 2 tablas en mi base de datos de las que necesito combinar información.
Una de ellas es una tabla de registro, que registra el cambio de estado de todos los productos en el sistema. Ejemplo de estructura:

FechaCambio Producto UltimoEstado NuevoEstado
2021-10-01 A Nuevo Envejeciendo
2021-11-02 A Envejeciendo Reponiendo
2021-11-25 A Reponiendo APAGADO
2021-08-03 B Nuevo Envejeciendo
2021-09-04 B Nuevo Envejeciendo
2021-10-13 B Reponiendo APAGADO

La otra es una tabla de hechos que contiene cada venta de cada producto. Ejemplo de estructura:

Fecha Producto PrecioPagado
2021-10-02 A 124
2021-11-05 A 115
2021-08-25 B 223
2021-09-03 B 218

Quiero escribir una consulta que me traiga el estado del producto en el momento en que se vendió.
Resultado deseado:

Fecha Producto PrecioPagado EstadoEnEseMomento
2021-10-02 A 124 Envejeciendo
2021-11-05 A 115 Reponiendo
2021-08-25 B 223 Envejeciendo
2021-09-03 B 218 Envejeciendo

Llevo golpeándome la cabeza durante aproximadamente una semana y no puedo encontrar una respuesta a esto. Supongo que el mayor desafío es el rendimiento, ya que la tabla de hechos tiene alrededor de 2 millones de líneas y la tabla de registro también es bastante grande.

Gracias de antemano 🙂

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado del estado del producto en el momento de la venta, puedes utilizar una subconsulta o unir las dos tablas según el producto y la fecha de la venta. Aquí tienes un ejemplo de cómo usar una subconsulta:

    SELECT 
      Fecha, 
      f.Producto, 
      PrecioPagado, 
      (SELECT TOP 1 NuevoEstado 
       FROM TablaDeRegistro 
       WHERE Producto = f.Producto AND FechaCambio <= f.Fecha 
       ORDER BY FechaCambio DESC) AS EstadoEnElMomento
    FROM TablaDeHechos f
    

    En la subconsulta, seleccionamos el primer NuevoEstado de la TablaDeRegistro para cada producto que tenga una FechaCambio menor o igual a la Fecha en la TablaDeHechos, y ordenamos por FechaCambio en orden descendente. Esto nos dará el cambio de estado más reciente para ese producto en o antes de la fecha de venta.

    Unir las dos tablas se vería así:

    SELECT 
      f.Fecha, 
      f.Producto, 
      f.PrecioPagado, 
      l.NuevoEstado AS EstadoEnElMomento
    FROM TablaDeHechos f
    JOIN (
      SELECT 
        Producto, 
        MAX(FechaCambio) AS FechaCambio 
      FROM TablaDeRegistro 
      WHERE FechaCambio <= f.Fecha 
      GROUP BY Producto
    ) ultimo ON f.Producto = ultimo.Producto
    JOIN TablaDeRegistro l ON ultimo.Producto = l.Producto AND ultimo.FechaCambio = l.FechaCambio
    

    En este ejemplo, unimos la TablaDeHechos a una subconsulta que selecciona la última fecha de cambio de estado para cada producto que esté en o antes de la fecha de venta. Luego unimos la TablaDeRegistro a esta subconsulta para obtener el NuevoEstado para ese producto y fecha. Este enfoque puede ser más eficiente para conjuntos de datos grandes, pero siempre es una buena idea probar ambas opciones para ver cuál funciona mejor para tus datos específicos.

Comments are closed.