none
Ayuda en mi query!! RRS feed

  • Pregunta

  • Hola Buenas Comunidad aca otra vez con una duda que se me vino al querer hacer un reporte...

    El reporte en si tiene que listar la cantidad de envios que hizo uno de nuestros vehiculos en la semana y cuanto recaudo en cada envio y cuanta mercaderia llevo en cada envio...

    Las tablas que estoy utilizando son:

    HojaRuta:

    HojaRutaID

    Fecha

    EmpleadoID

    Empleados:

    EmpleadoID

    ApellidoyNombre

    HojaRutaDetalles:

    HojaRutaID

    EnvioID

    Importe

    NroSalida

    HojaRutaSalidas:

    HojaRutaID

    NroSalida

    VehiculoID

    Vehiculos:

    VehiculoID

    Patente

    Envios:

    EnvioID

    Bultos

    Esa es en si las tablas que yo uso para poder sacar estos datos...

    Y lo que yo trato de conseguir en estructura es algo similar a esto....

        Fecha          HojaRuta      Chofer     Vehiculo  Repartos  DineroRecau  Mercaderia

    09/08/2017         101         Perez E.   'ASD123'     12          $2000              50

    10/08/2017

     ...

    Este es hasta ahora el query que hice que calcula todo pero tengo un problema...

    Select 
    	Convert(varchar(10),Fecha,103) as 'Fecha',
    	Hr.HojaRutaID as 'Hoja Ruta',
    	SucursalNombre as 'Sucursal',
    	Emp.ApellidoyNombre as 'Chofer',
    	Patente as 'Vehiculo',
    	Count(HrD.EnvioID) as 'CantEnvios',
    	SUM(HrD.Importe) as 'Total',
    	SUM(E.Bultos) as 'Bultos'
    From
     HojaRuta as Hr 
     Inner Join Sucursales as Suc
    	ON Hr.SucursalID = Suc.SucursalID
     Inner Join HojaRutaSalida as HrS
    	ON Hr.HojaRutaID = HrS.HojaRutaID
     Inner Join Empleados as Emp
    	ON Hr.EmpleadoID = Emp.EmpleadoID
     Inner Join Vehiculos as Vehi
    	ON HrS.VehiculoID = Vehi.VehiculoID
     Inner Join HojaRutaDetalle as HrD
    	ON Hr.HojaRutaID = HrD.HojaRutaID
     Inner Join Envios as E
    	ON HrD.EnvioID = E.EnvioID
    Where Patente <> 'AAAZZZ' and Hr.SucursalID = 1 and Hr.Fecha between '20170807' and '20170811' and Vehi.Patente = 'KMH565'
    Group By
    	Hr.HojaRutaID,Emp.ApellidoyNombre,Hr.Fecha,Suc.SucursalNombre,Vehi.Patente,TotalACobrar,TotalCobrado,HrD.NroSalida
    Having HrD.NroSalida >= 1

    Al calcular la cantidad de Repartos como la Recaudacion y la Mercaderia si en el campo NrodeSalida hay mas de 1 me duplica (hasta en algunos casos) Sextuplica los valores normales que tiene que arrojar el Query...

    Por Ejemplo supongamos en el ejemplo que yo hice hay 3 numeros de salida(el chofer fue 1 vez no lo atendieron, la segunda tampoco a la tercera pudo entregar la mercaderia) en HojaRutaDetalle figuran en numero de salida la salida en la cual el chofer pudo entregar la mercaderia entonces a pesar que los demas envios fueron entregados en la primer salida gracias a esa tercer salida me triplico todos los valores que me tuvieron que dar...

    Espero que se entienda y me puedan decir donde tengo el error o que tendria que agregar.

    Muchas Gracias!

    martes, 15 de agosto de 2017 19:46

Respuestas

  • Entiendo que la duplicidad se genera a partir de las múltiples salidas que puede tener un envío, las mismas que se registran en la tabla 'HojaRutaSalida', en tal sentido la idea es evitar la combinación con las "n" filas, por ejemplo:

    WITH Salidas AS
    (
        SELECT Hr.HojaRutaID, Vehi.Patente
        FROM 
    	   HojaRuta AS Hr
    	   INNER JOIN HojaRutaSalida AS HrS ON Hr.HojaRutaID = HrS.HojaRutaID
    	   INNER JOIN Vehiculos AS Vehi ON HrS.VehiculoID = Vehi.VehiculoID
        WHERE 
    	   Hr.SucursalID = 1 AND Hr.Fecha BETWEEN '20170807' AND '20170811' 
    	   AND Vehi.Patente = 'KMH565'
        GROUP BY Hr.HojaRutaID, Vehi.Patente
    )
    SELECT 
        CONVERT(VARCHAR(10), Hr.Fecha, 103) AS 'Fecha',
        Hr.HojaRutaID AS 'Hoja Ruta',
        Suc.SucursalNombre AS 'Sucursal',
        Emp.ApellidoyNombre AS 'Chofer',
        S.Patente AS 'Vehiculo',
        COUNT(HrD.EnvioID) AS 'CantEnvios',
        SUM(HrD.Importe) AS 'Total',
        SUM(E.Bultos) AS 'Bultos'
    FROM 
        HojaRuta AS Hr
        INNER JOIN Sucursales AS Suc ON Hr.SucursalID = Suc.SucursalID    
        INNER JOIN Empleados AS Emp ON Hr.EmpleadoID = Emp.EmpleadoID
        INNER JOIN Salidas AS S ON Hr.HojaRutaID = S.HojaRutaID
        INNER JOIN HojaRutaDetalle AS HrD ON Hr.HojaRutaID = HrD.HojaRutaID
        INNER JOIN Envios AS E ON HrD.EnvioID = E.EnvioID
    GROUP BY Hr.Fecha, Hr.HojaRutaID, Suc.SucursalNombre, Emp.ApellidoyNombre, S.Patente
    HAVING HrD.NroSalida >= 1;
    GO



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta SomniaL miércoles, 16 de agosto de 2017 12:08
    miércoles, 16 de agosto de 2017 0:56

Todas las respuestas

  • Entiendo que la duplicidad se genera a partir de las múltiples salidas que puede tener un envío, las mismas que se registran en la tabla 'HojaRutaSalida', en tal sentido la idea es evitar la combinación con las "n" filas, por ejemplo:

    WITH Salidas AS
    (
        SELECT Hr.HojaRutaID, Vehi.Patente
        FROM 
    	   HojaRuta AS Hr
    	   INNER JOIN HojaRutaSalida AS HrS ON Hr.HojaRutaID = HrS.HojaRutaID
    	   INNER JOIN Vehiculos AS Vehi ON HrS.VehiculoID = Vehi.VehiculoID
        WHERE 
    	   Hr.SucursalID = 1 AND Hr.Fecha BETWEEN '20170807' AND '20170811' 
    	   AND Vehi.Patente = 'KMH565'
        GROUP BY Hr.HojaRutaID, Vehi.Patente
    )
    SELECT 
        CONVERT(VARCHAR(10), Hr.Fecha, 103) AS 'Fecha',
        Hr.HojaRutaID AS 'Hoja Ruta',
        Suc.SucursalNombre AS 'Sucursal',
        Emp.ApellidoyNombre AS 'Chofer',
        S.Patente AS 'Vehiculo',
        COUNT(HrD.EnvioID) AS 'CantEnvios',
        SUM(HrD.Importe) AS 'Total',
        SUM(E.Bultos) AS 'Bultos'
    FROM 
        HojaRuta AS Hr
        INNER JOIN Sucursales AS Suc ON Hr.SucursalID = Suc.SucursalID    
        INNER JOIN Empleados AS Emp ON Hr.EmpleadoID = Emp.EmpleadoID
        INNER JOIN Salidas AS S ON Hr.HojaRutaID = S.HojaRutaID
        INNER JOIN HojaRutaDetalle AS HrD ON Hr.HojaRutaID = HrD.HojaRutaID
        INNER JOIN Envios AS E ON HrD.EnvioID = E.EnvioID
    GROUP BY Hr.Fecha, Hr.HojaRutaID, Suc.SucursalNombre, Emp.ApellidoyNombre, S.Patente
    HAVING HrD.NroSalida >= 1;
    GO



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta SomniaL miércoles, 16 de agosto de 2017 12:08
    miércoles, 16 de agosto de 2017 0:56
  • Muchas Gracias yo sabia que el problema partía por eso pero no sabia como poder resolverlo.

    Marcado como resulto!.

    miércoles, 16 de agosto de 2017 12:10