SQL - Antiguedad de saldos, 30,60,90, mas

   
Vista:

Antiguedad de saldos, 30,60,90, mas

Publicado por Erasmo (15 intervenciones) el 15/06/2012 23:34:31
Hola a todos.

Estoy usando sql 2005 y necesito hacer un query que me presente las facturas de los clientes que estan por cobrar segun la cantidad de dias, es decir para clasificarlos segun su antiguedad, sumando todos los montos por cobrar de un mismo cliente a 30 dias, 60 dias, 90 dias o mas dias. Por ejemplo si el cliente X debe 3 facturas desde hace 30 dias esos tres montos debe ser sumados y colocados en la columna de 30 dias del query y si ese mismo clientes tienes otras facturas con mas dias que estos montos sean presentados en la columna correspondiente, todo en una misma linea y asi para todos los clientes.


Este es el query que estoy usando
select CodigoCliente,sum(totalfactura)TotalFactura,
case when datediff(d,fechafactura,'13/06/2012') BETWEEN 0 and 30 then TotalFactura end '1-30',
case when datediff(d,fechafactura,'13/06/2012') BETWEEN 31 and 60 then TotalFactura end '31-60',
case when datediff(d,fechafactura,'13/06/2012') BETWEEN 61 and 90 then TotalFactura end '61-90',
case when datediff(d,fechafactura,'13/06/2012') BETWEEN 91 and 9999 then TotalFactura end '91 o Mas'

from encfactura
where year(fechafactura) = 2012
group by CodigoCliente,
case when datediff(d,fechafactura,'13/06/2012') BETWEEN 0 and 30 then TotalFactura end,
case when datediff(d,fechafactura,'13/06/2012') BETWEEN 31 and 60 then TotalFactura end,
case when datediff(d,fechafactura,'13/06/2012') BETWEEN 61 and 90 then TotalFactura end,
case when datediff(d,fechafactura,'13/06/2012') BETWEEN 91 and 9999 then TotalFactura end
order by CodigoCliente



El resultado que estoy obtenidon con este query es el siguiente:
CodigoCliente | TotalFactura | 1-30 | 31-60 | 61-90 | 91 o Mas
392 | 47500.00 | 0.00 | 0.00 | 0.00 | 47500.00
392 | 1425.00 | 0.00 | 0.00 | 1425.00 | 0.00
392 | 79520.00 | 0.00 | 0.00 | 79520.00 | 0.00



Si se fijan el cliente 392 tiene dos montos en el rango de 61-90, estos dos rangos en lugar de aparecer en lineas separadas deberian estan sumados en una misma linea. El resultado que deseo obtener es el siguiente:



CodigoCliente | TotalFactura | 1-30 | 31-60 | 61-90 | 91 o Mas
392 | 128445.00 | 0.00 | 0.00 | 80945.00 | 47500.00



De forma tal que me muestre en una misma linea los montos acumulados segun en rango de dias por cliente para cada rango y asi para todos los clientes.

Agradecere cualquier ayuda que me puedan prestar.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Antiguedad de saldos, 30,60,90, mas

Publicado por leonardo_josue (880 intervenciones) el 18/06/2012 16:59:32
Hola Erasmo:

No estás tan errado en cómo planteas la consulta, aunque hay algunas cosas que corregir:

En primer lugar, en el GROUP BY sólo deberías agrupar por Codigo cliente, no por cada uno de los CASE-WHEN... así te mostrará todas las facturas agrupadas en un solo registro.

Segundo, Para el caso de los CASE-WHEN, DEBES UTILIZAR TAMBIÉN SUMATORIAS... en caso contrario te marcará que no estás agrupando por todos los campos (y esto tiene relación con el punto anterior). Prueba haciendo tu consulta de esta forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
  CodigoCliente,
  SUM(totalfactura)TotalFactura,
  SUM (
    CASE WHEN DATEDIFF(d,fechafactura,'13/06/2012') BETWEEN 0 AND 30
    THEN TotalFactura ELSE 0 END) '1-30',
  SUM(
    CASE WHEN DATEDIFF(d,fechafactura,'13/06/2012') BETWEEN 31 AND 60
    THEN TotalFactura ELSE 0 END) '31-60',
  SUM(
    CASE WHEN DATEDIFF(d,fechafactura,'13/06/2012') BETWEEN 61 AND 90
    THEN TotalFactura ELSE 0 END) '61-90',
  SUM(
    CASE WHEN DATEDIFF(d,fechafactura,'13/06/2012') >= 91
    THEN TotalFactura ELSE 0 END) '91 o Mas'
FROM encfactura
WHERE YEAR(fechafactura) = 2012
GROUP BY CodigoCliente
ORDER BY CodigoCliente



Observa que cada CASE-WHEN está encerrado ahora con un SUM. Observa también que se agregó un ELSE 0 para cada caso, de esta manera, si el registro no entra en algún rango NO SE SUMA NADA, si no pones esto, el resultado SIEMPRE SERÍA NULL. Observa que en el GROUP BY ya no hay necesidad de colocar cada CASE-WHEN.

Haz la prueba para ver si te funciona, y si continuas con problemas pon algunos datos de ejemplo y te ayudamos a resolver la consulta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Antiguedad de saldos, 30,60,90, mas

Publicado por Erasmo erasmorc@hotmail.com (15 intervenciones) el 18/06/2012 18:05:28
Excelente respuesta, quedo exactamente como lo queria, un millon de gracias hermano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Antiguedad de saldos, 30,60,90, mas

Publicado por leonardo_josue (880 intervenciones) el 18/06/2012 20:09:10
En realidad casi habías sacado la consulta por tu cuenta, era sólo cuestión de ayudarte a afinar algunos detalles ...

Olvidé hacerte una recomendación. cuando manejes fechas, siempre utiliza el formato ANSI (yyyy-mm-dd) este es el formato estándar que utilizan la mayoría de los DBMS y que te permiten portar una consulta de un servidor a otro sin necesidad de tener cuidado con el idioma o configuración del servidor en cuestión. Si bien la consulta puede funcionar con el formato que estás poniendo (dd/mm/yyyy) te puede traer problemas en un futuro.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Antiguedad de saldos, 30,60,90, mas

Publicado por adolfo aavanegas@gmail.com (1 intervención) el 13/07/2013 06:27:10
Muy buena explicacion, te felicito. y Gracias me servio de mucho a mi.

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Antiguedad de saldos, 30,60,90, mas

Publicado por William Lickez wlickez@intecap.edu.gt (1 intervención) el 09/12/2016 19:43:23
Buenas,

Tengo una duda... con respecto a lo siguiente

SUM(totalfactura)TotalFactura : "TotalFactura" es el nombre que se le está dando a la sumatoria "SUM(totalfactura)"????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar