Bases de Datos > SQL Server

 Consulta para obtener el pago mas retrasado

(1/2) > >>

ProfesorX:
Por lo regular yo soy el que da asistencia, pero ahora me toca que me den asistencia a mi XD.

Tengo la siguiente tabla en SQL Server:


--- Código: ---create table creditos_abonos
(
contrato_id int not null,
semana int not null,
interes decimal (18,2) not null default 0,
abono decimal (18,2) not null default 0,
iva decimal (18,2) not null default 0,
fecha_pago datetime not null default getdate(),
pagado bit not null default 0,
)

--- Fin del código ---

Un ejemplo de los valores de la tabla:

contrato_id   semana   interes   abono   iva   fecha_pago   pagado
5   6   217.50   906.25   34.80   2013-04-30 00:00:00.000   1
5   7   217.50   906.25   34.80   2013-05-07 00:00:00.000   1
5   8   217.50   906.25   34.80   2013-05-14 00:00:00.000   0
5   9   217.50   906.25   34.80   2013-05-21 00:00:00.000   0
5   10   217.50   906.25   34.80   2013-05-28 00:00:00.000   0
9   9   67.50   281.25   10.80   2013-04-30 00:00:00.000   0
9   10   67.50   281.25   10.80   2013-05-07 00:00:00.000   0

Yo lo que quiero es una consulta que me de la semana mas atrasada en pago de todos los contratos, en este caso se considera pagada cuando el campo pago = 1 y no pagada cuando pago = 0

o sea en base a lo anterior necesito que me regrese lo siguiente

contrato_id   semana   interes   abono   iva   fecha_pago   pagado
5   8   217.50   906.25   34.80   2013-05-14 00:00:00.000   0
9   9   67.50   281.25   10.80   2013-04-30 00:00:00.000   0

Tengo la siguiente consulta

--- Código: ---select
top 1
b.contrato_id, b.semana, b.interes, b.abono, b.iva, fecha_pago, pagado
from creditos_abonos as b
where pagado = 0
and fecha_pago < '24/08/2013'
and contrato_id = 5
order by contrato_id, semana;

--- Fin del código ---

El problema es que solo me regresa la semana mas atrasada de un solo contrato, en este caso el numero 5, y yo necesito la mas atrasada de todos los contratos de la tabla. Lo que he hecho es por medio de un ciclo dentro de un programa, revisar todas las filas de la tabla, cambiando el valor de la condicion contrato_id = 5, pero siento que es un metodo muy ineficiente. Si alguien tiene la manera de obtenerlo por medio de una sola consulta SQL me pareceria excelente.

Gracias de antemano =)

ProfesorX:
Bueno, yo mismo publicare la solucion, un amigo ya me ayudo con la solucion a mi problema, lo dejare publicado por si alguien llega a tener un problema parecido al mio sepa que hacer :)


--- Código: ---select b.contrato_id, b.semana, b.interes, b.abono, b.iva, fecha_pago, pagado
from creditos_abonos b,
(SELECT MIN(c.semana) as semana, c.contrato_id as contrato_id
FROM creditos_abonos c
WHERE c.pagado =0
AND c.fecha_pago < '24/08/2013'
GROUP BY c.contrato_id)
as c where pagado = 0
and fecha_pago < '24/08/2013'
AND b.semana = c.semana
AND c.contrato_id = b.contrato_id
order by b.contrato_id, c.semana;

--- Fin del código ---

Igual si alguno tiene alguna otra forma de obtenerlo, no esta de mas.

Gracias a todos :)

gabio2:
Creo que te complicaste un poco, obtuve el mismo resultado con la siguiente sentencia:


--- Código: SQL ---SELECT b.contrato_id, b.semana, b.interes, b.abono, b.iva, b.fecha_pago, b.pagado FROM creditos_abonos b INNER JOIN (/*Aquí se hace la magia*/SELECT ca2.contrato_id,MIN(ca2.semana) AS Semana FROM creditos_abonos AS ca2WHERE ca2.pagado = 0 GROUP BY ca2.Contrato_id) AS PruebaON Prueba.contrato_id = b.contrato_id AND Prueba.Semana = b.semana 
Espero te sirva, Saludos!.

DiabloRojo:
Hola qué tal?

No servía hacer?:


--- Código: SQL ---SELECT contrato_id, MIN(semana) AS semana, interes, abono, iva, fecha_pago, pagado     FROM creditos_abonos     WHERE pagado = 0     GROUP BY contrato_id; 

gabio2:
Que tal saludos DiabloRojo.

Respondiendo tú pregunta, no, no sirve de tal manera como la pones debido a que el GROUP BY solo lo tiene contrato_id (para realizar eso es necesario agregar más campos al group by, pero entonces no regresara los datos que ProfesorX necesita), para agregar más campos es necesario usar alguna función como MAX, MIN, etc., en los campos que no estén dentro del GROUP BY.

Realice lo mismo que tú para llamar al contrado_id y semana, para hacer un inner join y poder obtener la información de los demás campos.

Saludos! :)

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa