none
Consulta SQL varias tablas RRS feed

  • Pregunta

  • Hola, tengo la siguiente consulta pero no funciona bien,

    SELECT p.idProducto,p.Codigo, p.Nombre,
    ISNULL(SUM(td.Cantidad),0) 'Transferencia',  
    ISNULL(SUM(vsd.Cantidad+vsd.Cantidad1),0) 'Ventas Sucursal',    
    ISNULL(bd.Cantidad,0) 'Bajas',  
    ISNULL(ps.Stock,0) 'Stock Actual'
    FROm productos p  
    LEFT JOIN transferencia_detalle td ON td.idProducto=p.idProducto  
    LEFT JOIN productos_stock ps ON ps.idProducto=p.idProducto  
    LEFT JOIN bajas_detalle bd ON bd.idProducto=p.idProducto  
    LEFT JOIN ventasSucursal_detalle vsd ON vsd.idProducto=p.idProducto  
    WHERE ps.idPuesto=2
    GROUP BY p.idProducto,p.Nombre, p.Codigo,ps.Stock, bd.Cantidad ORDER BY p.Nombre

    Tanto las transferencias como las bajas me duplica o triplica el valor que es.

    Yo necesito que me sume para el mismo producto cuantas bajas, transferencias y ventas x sucursal tuve sumando sus cantidades.Saludos

    martes, 14 de mayo de 2019 11:58

Respuestas

  • Tienes que usar COALESCE para presentar el primaer valor que no sea la marca NULL.

    SELECT
        COALESCE(V.idProducto, B.idProducto) AS idProducto,
    	COALESCE(V.Codigo, B.Codigo) AS Codigo,
    	COALESCE(V.Nombre, B.Nombre) AS Nombre,
    	COALESCE(V.idPuesto, B.idPuesto) AS idPuesto,
    	ISNULL(V.Transferencia, 0) AS Transferencia,
    	ISNULL(B.Bajas, 0) AS Bajas
    FROM(
        SELECT
            p.idProducto,
            p.Codigo,
            p.Nombre,
            ISNULL(SUM(td.Cantidad), 0) AS Transferencias,
            ps.idPuesto
        FROM
            productos AS p
            LEFT JOIN
            productos_stock AS ps
            ON ps.idProducto = p.idProducto
            LEFT JOIN
            transferencia_detalle AS td
            ON td.idProducto = p.idProducto
        GROUP BY
            p.idProducto,
            p.Nombre,
            p.Codigo,
            ps.idPuesto
    	) AS V
        
    	FULL OUTER JOIN
        
    	(
        SELECT
            p.idProducto,
            p.Codigo,
            p.Nombre,
            ISNULL(SUM(bd.Cantidad), 0) AS Bajas,
            ps.idPuesto
        FROM
            productos AS p
            LEFT JOIN
            productos_stock AS ps
            ON ps.idProducto = p.idProducto
            LEFT JOIN
            bajas_detalle AS bd
            ON bd.idProducto = p.idProducto
        GROUP BY
            p.idProducto,
            p.Nombre,
            p.Codigo,
            ps.idPuesto
        ) AS B
        ON B.idProducto = V.idProducto
    	AND B.idPuesto = V.idPuesto;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 14 de mayo de 2019 15:23

Todas las respuestas

  • Si esos procesos son independientes entonces debes calcularagrupar / agregar cada uno de ellos por separado y luego integrarlos o unirlos.

    select
        *
    from
        (aca ventas a nivel de producto) as V
        full outer join
        (aca bajas a nivel de producto) as B
        on B.producto_id = V.producto_id
        full outer join
        (aca tasferencias a nivel de producto) as T
        on T.producto_id = V.producto_id
        or T.producto_id = B.producto_id
        ...

    Usar CTEs hara el codigo mas legible.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 14 de mayo de 2019 12:22
  • Hola, hice pero me duplica toda la info

    SELECT *  FROM     ( SELECT p.idProducto,p.Codigo, p.Nombre,
    ISNULL(SUM(td.Cantidad),0) 'Transferencia',ps.idPuesto FROm productos p  LEFT JOIN productos_stock ps ON ps.idProducto=p.idProducto  
    LEFT JOIN transferencia_detalle td ON td.idProducto=p.idProducto  GROUP BY p.idProducto,p.Nombre, p.Codigo, ps.idPuesto ) as V
        full outer join
        (SELECT p.idProducto,p.Codigo, p.Nombre,
    ISNULL(SUM(bd.Cantidad),0) 'Bajas',  ps.idPuesto FROm productos p  LEFT JOIN productos_stock ps ON ps.idProducto=p.idProducto  
    LEFT JOIN bajas_detalle bd ON bd.idProducto=p.idProducto   GROUP BY p.idProducto,p.Nombre, p.Codigo, ps.idPuesto ) as B
        ON B.idProducto = V.idProducto

    El resultado es este:

    4    144    Venta minorista asado    0.00    1    4    144    Venta minorista asado    0.00    1
    4    144    Venta minorista asado    0.00    2    4    144    Venta minorista asado    0.00    1
    5    18574    vacio no liquido    0.00    1    5    18574    vacio no liquido    0.00    1
    5    18574    vacio no liquido    0.00    2    5    18574    vacio no liquido    0.00    1
    6    91    Asado novillo 10 cost    0.00    1    6    91    Asado novillo 10 cost    0.00    1

    o estoy haciendo algo mal?

    Gracias!

    martes, 14 de mayo de 2019 12:42
  • Mauricio,

    La mejor manera para nosotros poder ayudarte es que postees data de ejemplo y resultados esperados.

    Por lo pronto dire que cada tabla derivada debe estar al mismo nivel de granularidad, en este caso a nivel de producto.

    Si agrupas al nivel de (producto, puesto) entonces las tablas derivadas deben unirse a ese mismo nivel.

    SELECT
        *
    FROM(
        SELECT
            p.idProducto,
            p.Codigo,
            p.Nombre,
            ISNULL(SUM(td.Cantidad), 0) AS Transferencia,
            ps.idPuesto
        FROM
            productos AS p
            LEFT JOIN
            productos_stock AS ps
            ON ps.idProducto = p.idProducto
            LEFT JOIN
            transferencia_detalle AS td
            ON td.idProducto = p.idProducto
        GROUP BY
            p.idProducto,
            p.Nombre,
            p.Codigo,
            ps.idPuesto
    	) AS V
        
    	FULL OUTER JOIN
        
    	(
        SELECT
            p.idProducto,
            p.Codigo,
            p.Nombre,
            ISNULL(SUM(bd.Cantidad), 0) AS Bajas,
            ps.idPuesto
        FROM
            productos AS p
            LEFT JOIN
            productos_stock AS ps
            ON ps.idProducto = p.idProducto
            LEFT JOIN
            bajas_detalle AS bd
            ON bd.idProducto = p.idProducto
        GROUP BY
            p.idProducto,
            p.Nombre,
            p.Codigo,
            ps.idPuesto
        ) AS B
        ON B.idProducto = V.idProducto
    	AND B.idPuesto = V.idPuesto;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 14 de mayo de 2019 13:59
  • Hola HUnchback! El resultado que necesito es ese, pero sin repetir tantas veces idProducto, Codigo, Nombre.

    Con que muestre el primer select esos 3 campos ya esta, el resultado esperado seria

    idProducto, Codigo, Nombre, Transferencias, Bajas, idPuesto

    y no como sale ahora en este formato:

    idProducto, Codigo, Nombre, Transferencias, idPuesto, idProducto, Codigo, Nombre,Bajas, idPuesto

    Me explico? Te agradezco la ayuda!

    martes, 14 de mayo de 2019 15:09
  • Tienes que usar COALESCE para presentar el primaer valor que no sea la marca NULL.

    SELECT
        COALESCE(V.idProducto, B.idProducto) AS idProducto,
    	COALESCE(V.Codigo, B.Codigo) AS Codigo,
    	COALESCE(V.Nombre, B.Nombre) AS Nombre,
    	COALESCE(V.idPuesto, B.idPuesto) AS idPuesto,
    	ISNULL(V.Transferencia, 0) AS Transferencia,
    	ISNULL(B.Bajas, 0) AS Bajas
    FROM(
        SELECT
            p.idProducto,
            p.Codigo,
            p.Nombre,
            ISNULL(SUM(td.Cantidad), 0) AS Transferencias,
            ps.idPuesto
        FROM
            productos AS p
            LEFT JOIN
            productos_stock AS ps
            ON ps.idProducto = p.idProducto
            LEFT JOIN
            transferencia_detalle AS td
            ON td.idProducto = p.idProducto
        GROUP BY
            p.idProducto,
            p.Nombre,
            p.Codigo,
            ps.idPuesto
    	) AS V
        
    	FULL OUTER JOIN
        
    	(
        SELECT
            p.idProducto,
            p.Codigo,
            p.Nombre,
            ISNULL(SUM(bd.Cantidad), 0) AS Bajas,
            ps.idPuesto
        FROM
            productos AS p
            LEFT JOIN
            productos_stock AS ps
            ON ps.idProducto = p.idProducto
            LEFT JOIN
            bajas_detalle AS bd
            ON bd.idProducto = p.idProducto
        GROUP BY
            p.idProducto,
            p.Nombre,
            p.Codigo,
            ps.idPuesto
        ) AS B
        ON B.idProducto = V.idProducto
    	AND B.idPuesto = V.idPuesto;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 14 de mayo de 2019 15:23