none
Necesito ayuda en mi query por favor!! RRS feed

  • Pregunta

  • Hola necesitaria que me ayuden a resolver esto por que me estoy quemando la cabeza la verdad jajjaja

    Necesito hacer un reporte en el cual muestre lo siguiente:

    Monto adeudado de todos los clientes que tengo en mi base que no esten bloqueados y sean activos (eso esta resuelto)

    A partir de ese monto tengo que ver si ese monto supera el limite de credito que tiene cada cliente o si registra deudas en sus facturas por lo menos despues de 2 meses de haber sido emitidas las facturas...

    El query que tengo hasta ahora es el siguiente:

    SELECT
        cli.ClienteID,
        ClienteNombre,
        SUM(ImporteTotal) as 'Importe Total',
    SUM(ImportePagado) as 'Importe Pagado',
    SUM(ImporteTotal-ImportePagado) as 'Monto Adeudado',
    cli.LimiteCredito
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
    AND cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO'
    GROUP BY
        cli.ClienteID,
        ClienteNombre,
    cli.LimiteCredito
    HAVING
        SUM(ImporteTotal - ImportePagado) > (cli.LimiteCredito) 
    OR MAX(DATEDIFF(DAY,GETDATE(),cta.FechaComprobante)) < 30
    ORDER BY
        cli.ClienteID;

    El tema esta en que en mi base tenemos facturas del 2015/2014 (que no tienen nada que ver con las facturas actuales 2017/2016) que me estan tomando los datos en el query...

    Para ponerlo en limpio los datos que tienen que ser tienen que estar dentro del 2016 al 2017 todo lo demas no tiene que estar contemplado.

    Si no se entiende tratare de hacer mejores acotaciones.

    Lo necesito medio urgente ayuda por favor!!

    martes, 8 de agosto de 2017 17:29

Respuestas

  • Si de verdad es urgente entonces tendras mas probabilidad de obtener ayuda si posteas la estructura de las tablas involucradas (columnas de interes), data ejemplo en forma de sentencias INSERT asi como los resultados esperados.

    Ayudanos para poder ayudarte.

    Dicho lo anterior, la primera parte del ejeiccio ya lo tienes casi resuelto. Solo queda que limites la data al periodo señalado pero como no mencionas que columna usar para filtrar que los datos deben estar entre 2016 y 2017 entonces tendras que ajustar el query.

    SELECT
        cli.ClienteID,
        ClienteNombre,
        SUM(ImporteTotal) as 'Importe Total',
        SUM(ImportePagado) as 'Importe Pagado',
        SUM(ImporteTotal-ImportePagado) as 'Monto Adeudado',
        cli.LimiteCredito
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
        AND cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO'
        AND cta.FechaFactura >= '20160101'
        AND cta.FechaFactura < '20180101'
    GROUP BY
        cli.ClienteID,
        ClienteNombre,
        cli.LimiteCredito
    HAVING
        SUM(ImporteTotal - ImportePagado) > (cli.LimiteCredito);

    En cuanto a las facturas con deudas, tendras que seleccionar dichas facturas primero y despues filtrar las que se emitieron mas de dos meses y unir este resultado con el anterior.

    Algo asi como:

    -- monto mayor al limite de credito
    SELECT
        cli.ClienteID
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
        AND cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO'
        AND cta.FechaFactura >= '20160101'
        AND cta.FechaFactura < '20180101'
    GROUP BY
        cli.ClienteID,
        ClienteNombre,
        cli.LimiteCredito
    HAVING
        SUM(ImporteTotal - ImportePagado) > (cli.LimiteCredito)
    
    UNION
    
    -- factura con monto mayor a cero y emitida hace mas de dos meses
    
    SELECT
        cli.ClienteID
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
        AND cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO'
        AND cta.FechaFactura >= '20160101'
        AND cta.FechaFactura < '20180101'
    GROUP BY
        cli.ClienteID,
        cli.ClienteNombre,
        cli.LimiteCredito,
        cta.FacturaID
    HAVING
        SUM(ImporteTotal - ImportePagado) > 0
        AND DATEDIFF(MONTH, MAX(cta.FechaFactura), CURRENT_TIMESTAMP) >= 2;

    Si vuelcas esos ids hacia una tabla temporal entonces podras calcular los montos a nivel de cliente para esos clientes en especifico.


    AMB

    Some guidelines for posting questions...

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


    • Editado HunchbackMVP martes, 8 de agosto de 2017 18:09
    • Marcado como respuesta SomniaL jueves, 10 de agosto de 2017 14:38
    martes, 8 de agosto de 2017 18:08

Todas las respuestas

  • Necesito los campos de tu bd  y un esbozo del resultado que necesitas para poder ayudarte.


    Pasa los puntos prro v:

    SUM(??.ImporteTotal - ??.ImportePagado) > (cli.LimiteCredito)  'esto podrias ponerlo en el primer where

    de la primera consulta , necesito mas datos para el siguiente y podrias utilizar not in o in ...

    • Editado DAMN1Self martes, 8 de agosto de 2017 17:59
    • Propuesto como respuesta DAMN1Self martes, 8 de agosto de 2017 17:59
    martes, 8 de agosto de 2017 17:48
  • ¿No basta con agregar una expresión de filtro -en la cláusula WHERE- discriminando las operaciones anteriores al año 2016?, algo como: AND YEAR(cta.FechaComprobante) >= 2016, o cualquier otra expresión que delimite las operaciones sobre las que deseas consultar.


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    martes, 8 de agosto de 2017 17:48
  • Los datos son esos que estan ahi ahora te muestro una forma que quedaria:

    ClienteID , ClienteNombre, ImporteTotal,ImportePagado,Monto Adeudado,LimiteDeCredito 

    1               Cliente1             1000              500                  500                      200

    Este cliente tiene un limite de credito de 200 pesos por lo que por ende no puede llegar a continuar haciendo compras con nosotros debido a que aun debe facturas de meses anteriores.

    Eso es lo que yo quiero que me muestra

    Lo que yo digo es que en el importe total me aparece de esos $1000 tal vez sean 300 de este mes (no lo tiene que contar) $500 del mes anterior (ese si y fue pagado) y $500 que estan desde el 2015.

    No se si me explico 

    martes, 8 de agosto de 2017 18:08
  • Si de verdad es urgente entonces tendras mas probabilidad de obtener ayuda si posteas la estructura de las tablas involucradas (columnas de interes), data ejemplo en forma de sentencias INSERT asi como los resultados esperados.

    Ayudanos para poder ayudarte.

    Dicho lo anterior, la primera parte del ejeiccio ya lo tienes casi resuelto. Solo queda que limites la data al periodo señalado pero como no mencionas que columna usar para filtrar que los datos deben estar entre 2016 y 2017 entonces tendras que ajustar el query.

    SELECT
        cli.ClienteID,
        ClienteNombre,
        SUM(ImporteTotal) as 'Importe Total',
        SUM(ImportePagado) as 'Importe Pagado',
        SUM(ImporteTotal-ImportePagado) as 'Monto Adeudado',
        cli.LimiteCredito
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
        AND cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO'
        AND cta.FechaFactura >= '20160101'
        AND cta.FechaFactura < '20180101'
    GROUP BY
        cli.ClienteID,
        ClienteNombre,
        cli.LimiteCredito
    HAVING
        SUM(ImporteTotal - ImportePagado) > (cli.LimiteCredito);

    En cuanto a las facturas con deudas, tendras que seleccionar dichas facturas primero y despues filtrar las que se emitieron mas de dos meses y unir este resultado con el anterior.

    Algo asi como:

    -- monto mayor al limite de credito
    SELECT
        cli.ClienteID
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
        AND cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO'
        AND cta.FechaFactura >= '20160101'
        AND cta.FechaFactura < '20180101'
    GROUP BY
        cli.ClienteID,
        ClienteNombre,
        cli.LimiteCredito
    HAVING
        SUM(ImporteTotal - ImportePagado) > (cli.LimiteCredito)
    
    UNION
    
    -- factura con monto mayor a cero y emitida hace mas de dos meses
    
    SELECT
        cli.ClienteID
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
        AND cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO'
        AND cta.FechaFactura >= '20160101'
        AND cta.FechaFactura < '20180101'
    GROUP BY
        cli.ClienteID,
        cli.ClienteNombre,
        cli.LimiteCredito,
        cta.FacturaID
    HAVING
        SUM(ImporteTotal - ImportePagado) > 0
        AND DATEDIFF(MONTH, MAX(cta.FechaFactura), CURRENT_TIMESTAMP) >= 2;

    Si vuelcas esos ids hacia una tabla temporal entonces podras calcular los montos a nivel de cliente para esos clientes en especifico.


    AMB

    Some guidelines for posting questions...

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


    • Editado HunchbackMVP martes, 8 de agosto de 2017 18:09
    • Marcado como respuesta SomniaL jueves, 10 de agosto de 2017 14:38
    martes, 8 de agosto de 2017 18:08
  • Hola Perdon las tablas que estoy utilizando son:

    Clientes:

    ClienteID (bigint),

    ClienteNombre (varchar),

    LimiteCredito (decimal).

    Bloqueado (char),

    Estado (char)

    ClientesCuentasCorrientes:

    ClienteID (bigint),

    FechaComprobante (smalldatetime),

    TipoOperacion (char),

    ImporteTotal (decimal),

    ImportePagado (decimal),

    Yo lo que necesito es que supere el monto adeudado al limite de credito O que junto a esa condicion tengan mas de 2 meses de deudas ya que esto va a ser para correr un proceso que se haga todos los primeros de mes por lo que la factura que se genera del corriente mes siempre va a estar impaga.




    • Editado SomniaL martes, 8 de agosto de 2017 19:44
    martes, 8 de agosto de 2017 19:14
  • /* Clientes cuyo Monto adeudado supera el limite de credito o presentan deudas hace mas de un mes */
    
    SELECT
        cli.ClienteID,
        ClienteNombre,
    	suc.SucursalNombre,
        SUM(ImporteTotal) as 'Importe Total',
        SUM(ImportePagado) as 'Importe Pagado',
        SUM(ImporteTotal-ImportePagado) as 'Monto Adeudado',
        cli.LimiteCredito,
    	(
    	Select count(cta1.nrooperacion) 
    	From ClientesCtaCte cta1 
    	where cta1.ClienteID  = cli.ClienteID 
    	AND (cta1.ImporteTotal > cta1.ImportePagado)  
    	AND (cta1.FechaComprobante between '20170101' and GetDATE()) 
    	AND DATEDIFF(MONTH,cta1.FechaComprobante, GETDATE()) >= 1
    	AND (cta1.TipoOperacion = 'FAC' or cta1.TipoOperacion = 'CPO')
    	) AS CantidadCompDebe
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    	INNER JOIN
    	Sucursales AS suc
    	ON cli.SucursalID = suc.SucursalID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
        AND (cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO')
        AND (cta.FechaComprobante between '20170101' and GetDATE())
    	AND DATEDIFF(MONTH,cta.FechaComprobante, GETDATE()) >= 1 
    GROUP BY
        cli.ClienteID,
        ClienteNombre,
        cli.LimiteCredito,
    	suc.SucursalNombre
    HAVING
        SUM(ImporteTotal - ImportePagado) > (cli.LimiteCredito)
    	OR (SUM(ImporteTotal - ImportePagado) > 0)
    ORDER BY
    	cli.ClienteID
    
    /* Clientes Cuyo Monto adeudado supera el limite de credito */
    
    SELECT
        cli.ClienteID,
        ClienteNombre,
    	suc.SucursalNombre,
        SUM(ImporteTotal) as 'Importe Total',
        SUM(ImportePagado) as 'Importe Pagado',
        SUM(ImporteTotal-ImportePagado) as 'Monto Adeudado',
        cli.LimiteCredito,
    	(select count(cta1.nrooperacion) From ClientesCtaCte cta1 
    	where cta1.ClienteID  = cli.ClienteID and cta1.ImportePagado < cta1.ImporteTotal
    	AND (cta1.FechaComprobante between '20170101' and GetDATE()) 
    	AND DATEDIFF(MONTH,cta1.FechaComprobante, GETDATE()) >= 1 ) as CantidadCompDebe
    FROM
        ClientesCtaCte AS cta
        INNER JOIN
        Clientes AS cli
        ON cta.ClienteID = cli.ClienteID
    	INNER JOIN
    	Sucursales AS suc
    	ON cli.SucursalID = suc.SucursalID
    WHERE
        cli.Bloqueado = 'N'
        AND cli.Estado = 'A'
        AND (cta.TipoOperacion = 'FAC' or cta.TipoOperacion = 'CPO')
        AND (cta.FechaComprobante between '20170101' and GetDATE())
    	AND DATEDIFF(MONTH,cta.FechaComprobante, GETDATE()) >= 1 
    GROUP BY
        cli.ClienteID,
        ClienteNombre,
        cli.LimiteCredito,
    	suc.SucursalNombre
    HAVING
        SUM(ImporteTotal - ImportePagado) > (cli.LimiteCredito)
    ORDER BY
    	cli.ClienteID

    Este es el reporte final que pude hacer gracias a los aportes que me dieron ustedes lo coloco para que si alguien lo pueda llegar a necesitar ya lo tienen!.

    Se separa en dos partes ya que la primera integra lo que yo buscaba y la segunda solamente muestra los clientes cuyo monto adeudado supera el limete de credito.

    Muchas gracias por las respuestas brindadas.

    jueves, 10 de agosto de 2017 14:37