none
Sub Consulta con datos en dos tablas RRS feed

  • Pregunta

  • Hola

    Solicito amablemente su colaboración con la siguiente consulta:

    Se tienen las siguientes tablas:

    CREATE TABLE PRODUCTO (
    ID INT NOT NULL IDENTITY, 
    CODIGO VARCHAR(50),
    PRECIO INT, 
    PRIMARY KEY (ID)
    );
    
    INSERT INTO PRODUCTO(CODIGO,PRECIO) VALUES ('AAA','100');
    INSERT INTO PRODUCTO(CODIGO,PRECIO) VALUES ('BBB','200');
    
    CREATE TABLE PRODUCTO_DETALLE (
    ID INT NOT NULL IDENTITY, 
    CODIGO VARCHAR(50),
    UBICACION VARCHAR(50),
    PRIMARY KEY (ID)
    );
    
    INSERT INTO PRODUCTO_DETALLE(CODIGO,UBICACION) VALUES ('AAA','BODEGA1');
    INSERT INTO PRODUCTO_DETALLE(CODIGO,UBICACION) VALUES ('AAA','BODEGA1');
    INSERT INTO PRODUCTO_DETALLE(CODIGO,UBICACION) VALUES ('AAA','BODEGA1');
    INSERT INTO PRODUCTO_DETALLE(CODIGO,UBICACION) VALUES ('BBB','BODEGA1');
    INSERT INTO PRODUCTO_DETALLE(CODIGO,UBICACION) VALUES ('BBB','BODEGA1');

    Por algún motivo las tablas no estan relacionadas con la llave foránea pero tienen un dato en común y es el campo CODIGO.

    Se requiere determinar la sumatoria del costo de los productos por bodega.

    Es decir: El producto AAA vale 100 y para el ejemplo hay 3 productos que serian 300 y el producto BBB vale 200 y hay 2 productos que serían 400, el resultado de la consulta para BODEGA1 debería ser 700.

    Muchas gracias.



    Respuesta de foro Microsoft


    • Editado yulfredy miércoles, 30 de septiembre de 2020 5:38
    miércoles, 30 de septiembre de 2020 5:26

Respuestas

  • Hola Yulfredy:

    Existen varias maneras de obtener tú resultado esperado.

    Te voy a dar una con el operador apply, ya que dentro de la subconsulta, que "este ejecuta", puedes en el conjunto externo, jugar para obtener otros datos. Lo que hace la misma, es obtener el número de veces por ubicación que se mencionan en sus lineas, y lo relaciona con el conjunto exterior por su codigo en el where pd.codigo = p.codigo

    select prdet.ubicacion
    	 , sum(p.precio * prdet.veces) as suma
    	   from producto AS p
    				 cross apply (
    							   select count(pd.codigo) as veces
    									, pd.ubicacion
    									  from producto_detalle AS pd
    									  where pd.codigo = p.codigo
    									  group by pd.codigo
    											 , pd.ubicacion
    							 ) AS prdet
    	   group by prdet.ubicacion;

    Operador apply

    https://javifer2.wordpress.com/2020/06/27/operador-apply/

    • Marcado como respuesta yulfredy miércoles, 30 de septiembre de 2020 21:03
    miércoles, 30 de septiembre de 2020 6:29

Todas las respuestas

  • Hola Yulfredy:

    Existen varias maneras de obtener tú resultado esperado.

    Te voy a dar una con el operador apply, ya que dentro de la subconsulta, que "este ejecuta", puedes en el conjunto externo, jugar para obtener otros datos. Lo que hace la misma, es obtener el número de veces por ubicación que se mencionan en sus lineas, y lo relaciona con el conjunto exterior por su codigo en el where pd.codigo = p.codigo

    select prdet.ubicacion
    	 , sum(p.precio * prdet.veces) as suma
    	   from producto AS p
    				 cross apply (
    							   select count(pd.codigo) as veces
    									, pd.ubicacion
    									  from producto_detalle AS pd
    									  where pd.codigo = p.codigo
    									  group by pd.codigo
    											 , pd.ubicacion
    							 ) AS prdet
    	   group by prdet.ubicacion;

    Operador apply

    https://javifer2.wordpress.com/2020/06/27/operador-apply/

    • Marcado como respuesta yulfredy miércoles, 30 de septiembre de 2020 21:03
    miércoles, 30 de septiembre de 2020 6:29
  • Muchas gracias por la explicación

    Respuesta de foro Microsoft

    miércoles, 30 de septiembre de 2020 21:05