none
Unir consulta de Almacenes RRS feed

  • Pregunta

  • Buenos días!!

    Necesito ayuda para unir tablas en un sola consulta, tengo varias tablas donde guardo los datos de la siguiente forma:

    Silo_A:

    Id | Fecha | Entradas | Consumo_PA | Consumo_PB

    Silo_B:

    Id | Fecha | Entradas | Consumo_PA | Consumo_PB

    Silo_C:

    Id | Fecha | Entradas | Consumo_PA 

    Necesito relacionar las tablas de tal manera que me aparezca un solo campo de Fecha y a continuación las entradas y los consumos de cada silo, el problema lo tengo en los saltos de fechas que hay entre silo, ya que en uno puede haber movimientos y en otro u otros no.

    SELECT * FROM SILO_A 
    INNER JOIN SILO_B ON SILO_A.Fecha = SILO_B.Fecha
    INNER JOIN SILO_C ON SILO_A.Fecha = SILO_C.Fecha
    Estoy intentándolo con esta consulta pero no se si voy bien encaminado, ya que en los registro que no tienen la fecha coincidente con el SILO_A me repite las entradas o los consumo últimos. 

    viernes, 31 de enero de 2020 8:30

Respuestas

  • Hola JCede:

    Una opción es sumar por cada día cada uno de los silos, ya que no es discriminatorio entre conjuntos la fecha.

    create table Silo_A
    (Id               INT
    , Fecha            DATE
    , entrada_naci     INT
    , consumo_naci     INT
    , consumo_salmuera INT
    , consumo_caci2    INT
    );
    
    create table Silo_B
    (Id               INT
    , Fecha            DATE
    , entrada_naci     INT
    , consumo_naci     INT
    , consumo_salmuera INT
    , consumo_caci2    INT
    );
    GO
    
    INSERT INTO Silo_A (id, fecha, entrada_naci, consumo_naci, consumo_salmuera, consumo_caci2)
    values
    (1,'20141001',617650,0,0,0),
    (1,'20141208',0,6680,0,0),
    (1,'20141229',0,7440,0,0),
    (1,'20141229',0,5800,0,0),
    (1,'20141229',0,11200,0,0),
    (1,'20141230',0,4800,0,0),
    (1,'20141230',0,3950,0,0),
    (1,'20141230',0,3897,0,0),
    (1,'20150118',0,4614,0,0),
    (1,'20150118',0,7350,0,0),
    (1,'20150118',0,4450,0,0),
    (1,'20150118',0,7120,0,0);
    GO
    INSERT INTO Silo_B (id, fecha, entrada_naci, consumo_naci, consumo_salmuera, consumo_caci2)
    values
    (1,'20141001',635040,0,0,0),
    (1,'20141208',0,530,0,0),
    (1,'20141208',0,6517,0,0),
    (1,'20141229',0,5351,0,0),
    (1,'20141229',0,7204,0,0),
    (1,'20141229',0,6300,0,0),
    (1,'20141230',0,6551,0,0),
    (1,'20141230',0,7252,0,0),
    (1,'20141230',0,7800,0,0);
    GO

    solo te pongo dos tablas para el escenario, porque he recuperado algunos valores de tú imagen.

    WITH CTE
    	 AS (SELECT FECHA
    				FROM SILO_A
    		 UNION
    		 SELECT FECHA
    				FROM SILO_B),
    	 SILOA
    	 AS (SELECT SUM(SILO_A.ENTRADA_NACI) AS ENTRADA_NACI
    			  , SUM(SILO_A.CONSUMO_NACI) AS CONSUMO_NACI
    			  , SUM(SILO_A.CONSUMO_SALMUERA) AS CONSUMO_SALMUERA
    			  , SUM(SILO_A.CONSUMO_CACI2) AS CONSUMO_CACI2
    			  , SILO_A.FECHA
    				FROM SILO_A
    				GROUP BY SILO_A.FECHA),
    	 SILOB
    	 AS (SELECT SUM(SILO_B.ENTRADA_NACI) AS ENTRADA_NACI
    			  , SUM(SILO_B.CONSUMO_NACI) AS CONSUMO_NACI
    			  , SUM(SILO_B.CONSUMO_SALMUERA) AS CONSUMO_SALMUERA
    			  , SUM(SILO_B.CONSUMO_CACI2) AS CONSUMO_CACI2
    			  , SILO_B.FECHA
    				FROM SILO_B
    				GROUP BY SILO_B.FECHA)
    	 SELECT CTE.FECHA
    		  , SILOA.ENTRADA_NACI
    		  , SILOA.CONSUMO_NACI
    		  , SILOA.CONSUMO_SALMUERA
    		  , SILOA.CONSUMO_CACI2
    		  , SILOA.FECHA
    		  , SILOB.ENTRADA_NACI
    		  , SILOB.CONSUMO_NACI
    		  , SILOB.CONSUMO_SALMUERA
    		  , SILOB.CONSUMO_CACI2
    		  , SILOB.FECHA
    			FROM CTE
    				 LEFT JOIN SILOA ON CTE.FECHA = SILOA.FECHA
    				 LEFT JOIN SILOB ON CTE.FECHA = SILOB.FECHA;

    Primero obtenemos las diferentes fechas, y luego sumamos por conjuntos agrupados por fecha, para dar la salida, con un left join a cada uno de los conjuntos.

    Tablas de expresión común

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    • Propuesto como respuesta Diana AcuñaModerator martes, 4 de febrero de 2020 23:30
    • Marcado como respuesta JCede miércoles, 5 de febrero de 2020 10:15
    martes, 4 de febrero de 2020 17:44
  • Hola:

    Otra opción si no quieres sumar, y quieres presentar los datos con un detalle de cada fila, puedes hacer algo como:

    WITH SILOA AS
    	(	SELECT	ROW_NUMBER() OVER(PARTITION BY FECHA ORDER BY Fecha ASC) AS ROW
    			  , SILO_A.ENTRADA_NACI
    			  , SILO_A.CONSUMO_NACI
    			  , SILO_A.CONSUMO_SALMUERA
    			  , SILO_A.CONSUMO_CACI2
    			  , SILO_A.FECHA
    				FROM SILO_A
    				),
    	 SILOB
    	 AS (SELECT
    			    ROW_NUMBER() OVER(PARTITION BY FECHA ORDER BY Fecha ASC) AS ROW
    			  , SILO_B.ENTRADA_NACI
    			  , SILO_B.CONSUMO_NACI
    			  , SILO_B.CONSUMO_SALMUERA
    			  , SILO_B.CONSUMO_CACI2
    			  , SILO_B.FECHA
    				FROM SILO_B
    				)
    	 SELECT SILOA.Fecha
    		  , SILOA.ENTRADA_NACI
    		  , SILOA.CONSUMO_NACI
    		  , SILOA.CONSUMO_SALMUERA
    		  , SILOA.CONSUMO_CACI2
    		  , SILOB.FECHA
    		  , SILOB.ENTRADA_NACI
    		  , SILOB.CONSUMO_NACI
    		  , SILOB.CONSUMO_SALMUERA
    		  , SILOB.CONSUMO_CACI2
    		  
    			FROM SILOA FULL JOIN SILOB ON SILOA.Fecha = SILOB.Fecha AND SILOA.ROW = SILOB.ROW

    Lees cada tabla y la numeras con row_number. Luego relacionas los conjuntos con full join, para que te muestre cada resultado por fecha.

    Salida

    Row Number

    https://javifer2.wordpress.com/2019/11/11/row-number-numerar-filas/

    • Propuesto como respuesta Diana AcuñaModerator martes, 4 de febrero de 2020 23:31
    • Marcado como respuesta JCede miércoles, 5 de febrero de 2020 10:15
    martes, 4 de febrero de 2020 20:18

Todas las respuestas

  • Hola jcede

    Cambia los inner join por full join. Y si no es lo esperado, pega algún ejemplo

    viernes, 31 de enero de 2020 9:40
  • Muchas Gracias Javier,

    Algo he mejorado pero cuando tengo registros solo en alguno de los Silos lo que hace en el resto es arrastrarme el dato último. 

    viernes, 31 de enero de 2020 10:40
  • Hola JCede:

    Porque no pegas alguna fila con datos, y lo que esperas de resultado para poder echarte un cable.

    viernes, 31 de enero de 2020 13:35
  • Buenos Días Javier,

    Espero poder explicártelo mejor, al realizar la consulta si en uno de los silos ha habido más registros que en el otro tal y como tengo la consulta, me duplica su superior, por ejemplo en el día 08-12 hubo dos consumos en el Silo B y uno solo en el A, por lo tanto me duplica el consumo del A para cubrir el mismo número de registros. En el caso del día 29-12 si hay el mismo número de registros del silo A y el B pero los triplica las cuantías en cada silo. Te adjunto un tabla de lo que trato de realizar uniendo las tablas. 

    Un saludo y mil gracias

    lunes, 3 de febrero de 2020 10:18
  • Hola JCede:

    que en el otro tal y como tengo la consulta, me duplica su superior,

    El problema no es los registros de Silo_A que son null, sino como calculas las cuantías.

    ¿Cómo calculas los consumos?.

    lunes, 3 de febrero de 2020 18:58
  • Buenos Días Javier,

    Todos los datos de los campos se meten manualmente en la BD con una aplicación.

    Saludos

    martes, 4 de febrero de 2020 7:47
  • Hola JCede:

    Una opción es sumar por cada día cada uno de los silos, ya que no es discriminatorio entre conjuntos la fecha.

    create table Silo_A
    (Id               INT
    , Fecha            DATE
    , entrada_naci     INT
    , consumo_naci     INT
    , consumo_salmuera INT
    , consumo_caci2    INT
    );
    
    create table Silo_B
    (Id               INT
    , Fecha            DATE
    , entrada_naci     INT
    , consumo_naci     INT
    , consumo_salmuera INT
    , consumo_caci2    INT
    );
    GO
    
    INSERT INTO Silo_A (id, fecha, entrada_naci, consumo_naci, consumo_salmuera, consumo_caci2)
    values
    (1,'20141001',617650,0,0,0),
    (1,'20141208',0,6680,0,0),
    (1,'20141229',0,7440,0,0),
    (1,'20141229',0,5800,0,0),
    (1,'20141229',0,11200,0,0),
    (1,'20141230',0,4800,0,0),
    (1,'20141230',0,3950,0,0),
    (1,'20141230',0,3897,0,0),
    (1,'20150118',0,4614,0,0),
    (1,'20150118',0,7350,0,0),
    (1,'20150118',0,4450,0,0),
    (1,'20150118',0,7120,0,0);
    GO
    INSERT INTO Silo_B (id, fecha, entrada_naci, consumo_naci, consumo_salmuera, consumo_caci2)
    values
    (1,'20141001',635040,0,0,0),
    (1,'20141208',0,530,0,0),
    (1,'20141208',0,6517,0,0),
    (1,'20141229',0,5351,0,0),
    (1,'20141229',0,7204,0,0),
    (1,'20141229',0,6300,0,0),
    (1,'20141230',0,6551,0,0),
    (1,'20141230',0,7252,0,0),
    (1,'20141230',0,7800,0,0);
    GO

    solo te pongo dos tablas para el escenario, porque he recuperado algunos valores de tú imagen.

    WITH CTE
    	 AS (SELECT FECHA
    				FROM SILO_A
    		 UNION
    		 SELECT FECHA
    				FROM SILO_B),
    	 SILOA
    	 AS (SELECT SUM(SILO_A.ENTRADA_NACI) AS ENTRADA_NACI
    			  , SUM(SILO_A.CONSUMO_NACI) AS CONSUMO_NACI
    			  , SUM(SILO_A.CONSUMO_SALMUERA) AS CONSUMO_SALMUERA
    			  , SUM(SILO_A.CONSUMO_CACI2) AS CONSUMO_CACI2
    			  , SILO_A.FECHA
    				FROM SILO_A
    				GROUP BY SILO_A.FECHA),
    	 SILOB
    	 AS (SELECT SUM(SILO_B.ENTRADA_NACI) AS ENTRADA_NACI
    			  , SUM(SILO_B.CONSUMO_NACI) AS CONSUMO_NACI
    			  , SUM(SILO_B.CONSUMO_SALMUERA) AS CONSUMO_SALMUERA
    			  , SUM(SILO_B.CONSUMO_CACI2) AS CONSUMO_CACI2
    			  , SILO_B.FECHA
    				FROM SILO_B
    				GROUP BY SILO_B.FECHA)
    	 SELECT CTE.FECHA
    		  , SILOA.ENTRADA_NACI
    		  , SILOA.CONSUMO_NACI
    		  , SILOA.CONSUMO_SALMUERA
    		  , SILOA.CONSUMO_CACI2
    		  , SILOA.FECHA
    		  , SILOB.ENTRADA_NACI
    		  , SILOB.CONSUMO_NACI
    		  , SILOB.CONSUMO_SALMUERA
    		  , SILOB.CONSUMO_CACI2
    		  , SILOB.FECHA
    			FROM CTE
    				 LEFT JOIN SILOA ON CTE.FECHA = SILOA.FECHA
    				 LEFT JOIN SILOB ON CTE.FECHA = SILOB.FECHA;

    Primero obtenemos las diferentes fechas, y luego sumamos por conjuntos agrupados por fecha, para dar la salida, con un left join a cada uno de los conjuntos.

    Tablas de expresión común

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    • Propuesto como respuesta Diana AcuñaModerator martes, 4 de febrero de 2020 23:30
    • Marcado como respuesta JCede miércoles, 5 de febrero de 2020 10:15
    martes, 4 de febrero de 2020 17:44
  • Hola:

    Otra opción si no quieres sumar, y quieres presentar los datos con un detalle de cada fila, puedes hacer algo como:

    WITH SILOA AS
    	(	SELECT	ROW_NUMBER() OVER(PARTITION BY FECHA ORDER BY Fecha ASC) AS ROW
    			  , SILO_A.ENTRADA_NACI
    			  , SILO_A.CONSUMO_NACI
    			  , SILO_A.CONSUMO_SALMUERA
    			  , SILO_A.CONSUMO_CACI2
    			  , SILO_A.FECHA
    				FROM SILO_A
    				),
    	 SILOB
    	 AS (SELECT
    			    ROW_NUMBER() OVER(PARTITION BY FECHA ORDER BY Fecha ASC) AS ROW
    			  , SILO_B.ENTRADA_NACI
    			  , SILO_B.CONSUMO_NACI
    			  , SILO_B.CONSUMO_SALMUERA
    			  , SILO_B.CONSUMO_CACI2
    			  , SILO_B.FECHA
    				FROM SILO_B
    				)
    	 SELECT SILOA.Fecha
    		  , SILOA.ENTRADA_NACI
    		  , SILOA.CONSUMO_NACI
    		  , SILOA.CONSUMO_SALMUERA
    		  , SILOA.CONSUMO_CACI2
    		  , SILOB.FECHA
    		  , SILOB.ENTRADA_NACI
    		  , SILOB.CONSUMO_NACI
    		  , SILOB.CONSUMO_SALMUERA
    		  , SILOB.CONSUMO_CACI2
    		  
    			FROM SILOA FULL JOIN SILOB ON SILOA.Fecha = SILOB.Fecha AND SILOA.ROW = SILOB.ROW

    Lees cada tabla y la numeras con row_number. Luego relacionas los conjuntos con full join, para que te muestre cada resultado por fecha.

    Salida

    Row Number

    https://javifer2.wordpress.com/2019/11/11/row-number-numerar-filas/

    • Propuesto como respuesta Diana AcuñaModerator martes, 4 de febrero de 2020 23:31
    • Marcado como respuesta JCede miércoles, 5 de febrero de 2020 10:15
    martes, 4 de febrero de 2020 20:18
  • Buenos Días Javier,

    Muy agradecido por haberme dedicado tu tiempo y más por darme dos opciones. Sin duda me viene mejor la primera opción, ya que trato de realizar un informe por movimientos de los Silos. 

    Mil gracias y un saludo 

    miércoles, 5 de febrero de 2020 10:32
  • De nada.

    miércoles, 5 de febrero de 2020 13:15