Consulta sql

lestatab

Bovino maduro
#1
Qué tal, aquí de nuevo pidiendo ayuda :comillas:.
No es una necesidad, pero le da mejor forma a la presentación de la información.
Tengo una tabla de ventas y una de créditos, una venta puede tener un crédito (relacionada la venta a un cliente).
Ahora, quiero sacar los créditos de un cliente según sus ventas, la consulta es sencilla, algo así:
Código:
SELECT     creditos.id_detalle_venta AS Venta, creditos.id_credito AS Crédito, creditos.monto AS Total, creditos.saldo AS Saldo
FROM         creditos INNER JOIN
                      detalle_venta ON creditos.id_detalle_venta = detalle_venta.id_detalle_venta
WHERE     (creditos.id_paciente = @idCliente)
Pero como un cliente puede tener varios créditos, tengo primero que mostrar sus compras con sus créditos, pero me devuelve la lista, algo así como el historial.
Me gustaría mostrar sólo id id de la venta con el id del crédito el monto (total) y el saldo más bajo, esto es, el resultado de lo último que abono.
En forosdelweb está esto:
http://www.forosdelweb.com/f86/seleccionar-registro-con-mayor-valor-campo-653211/
y este código:
Código:
SELECT *
FROM (
    SELECT `egresados`.*, `practicas`.* 
    FROM `egresados` 
        LEFT JOIN `practicas` ON `egresados`.`user_id` = `practicas`.`user_id`
    WHERE `egresados`.`nombre` LIKE '%juan%'
    ORDER BY `practicas`.`uid` DESC) TablaTemp
GROUP BY `user_id`;
Pero es para mysql, y trabajo con sql server... :chommy:
 
#2
creo estas usando mal el join como lo pones en el ejemplo de abajo debe de ser left no inner
pon un ejemplo de tu table(2 o 3 registros) y de lo que quieres que te salga para entenderte, porque medio cantinfleaste
 

lestatab

Bovino maduro
#3
ok...

Código:
SELECT  creditos.id_detalle_venta AS Venta, creditos.id_credito AS Crédito, creditos.monto AS Total, creditos.saldo AS Saldo
FROM         creditos INNER JOIN
                      detalle_venta ON creditos.id_detalle_venta = detalle_venta.id_detalle_venta
WHERE     (creditos.id_paciente = 4) AND (creditos.estado LIKE N'%adeuda%')
Genera:
39 - 3 - 74.92 - 74.92
39 - 4 - 74.92 - 64.92
39 - 7 - 74.92 - 54.00

La Venta 39, tiene 3 abonos (credito 3,4 y 7) donde el abono se le restó y se registró.
Pero sólo qiero mostrar un registro con el saldo más bajo.
39 - 7 - 74.92 - 54.00
Porque si este cliente tiene más créditos con otra venta, q me muestre ese otro crédito pero solo con su último abono....
De esta manera, el usuario va a elegir qué venta va a abonar el cliente.
Como esto, el mismo cliente tiene dos comprar con sus créditos:
Código:
SELECT  creditos.id_detalle_venta AS Venta, creditos.id_credito AS Crédito, creditos.monto AS Total, creditos.saldo AS Saldo
FROM         creditos INNER JOIN
                      detalle_venta ON creditos.id_detalle_venta = detalle_venta.id_detalle_venta
WHERE     (creditos.id_paciente = 4) AND (creditos.estado LIKE N'%adeuda%')
ORDER BY creditos.id_detalle_venta, creditos.saldo ASC
39 - 7 - 74.92 - 54.00
39 - 4 - 74.92 - 64.92
39 - 3 - 74.92 - 74.92
41 - 6 - 148.50 - 148.50
41 - 8 - 200.00 - 180.00
Gracias.
 

malvadomx

Bovino maduro
#4
puedes hacer un order BY columna ASC LIMIT 1.. asi ordenas por la columna de menor cantidad y le haces el limite a uno pa que te regrese solo el primero, osea el que menos cantidad tiene
 

lestatab

Bovino maduro
#5
ok, gracias, lo checo mañana haber q resultados me da, espero q no me devuelva solo el primero de todos, porq necesito el primero de cada venta
 
#6
Creo esto te resultaria aunque para un id_paciente SELECT top(1) creditos.id_detalle_venta AS Venta, creditos.id_credito AS Crédito, creditos.monto AS Total, creditos.saldo AS Saldo FROM creditos INNER JOIN detalle_venta ON creditos.id_detalle_venta = detalle_venta.id_detalle_venta WHERE (creditos.id_paciente = 4) AND (creditos.estado LIKE N'%adeuda%') ORDER BY creditos.id_detalle_venta, creditos.saldo ASC
 

lestatab

Bovino maduro
#7
Resultados...

Así es, la opción de Abel_g es sólo para un solo id_paciente y una sola venta.
La de malvadomx, creo q el limit es para mysql. no?
Gracias y sigo sin poder realizarlo...
Saludos!
 

lestatab

Bovino maduro
#8
jejeje

Ya encontré una media solución...
Código:
SELECT  creditos.id_detalle_venta AS Venta, min(creditos.saldo) AS Saldo 
FROM         creditos 
GROUP BY creditos.id_detalle_venta
Resulta en:
39 - 54.00
40 - 200.00
41 - 148.50
de todo esto:
39 - 3 - 74.92 - 74.92
39 - 4 - 74.92 - 64.92
39 - 7 - 74.92 - 54.00
40 - 5 - 200.00 - 200.00
41 - 6 - 148.50 - 148.50
41 - 8 - 200.00 - 180.00
Ahora bien, la regla del group by dice q agrupas lo q selecionas, en este caso no solo qiero el id de la venta y el saldo, si no el id del credito y el monto, al realizar la consulta resulta que agrupa todo... da otro resultado...
Tengo q guardar mi primera consulta y unirlo o mostrarlo con otra consulta con los campos anteriores... creo... algo así:
Código:
SELECT  creditos.id_detalle_venta AS Venta, creditos.id_credito AS Crédito, creditos.monto AS Total 
FROM         creditos
Where creditos.id_detalle_venta in 
(SELECT  creditos.id_detalle_venta, min(creditos.saldo) AS Saldo 
FROM         creditos 
GROUP BY creditos.id_detalle_venta)
Pero como revuelvo dos campos en la subconsulta, no puede evaluar el in... creo XD..
 

lestatab

Bovino maduro
#9
Yaaaa!!

Ya está... gracias!
Código:
SELECT  creditos.id_detalle_venta AS Venta, creditos.id_credito AS Crédito, creditos.monto AS Total, creditos.saldo as Saldo
FROM         creditos
Where creditos.saldo in 
(SELECT  min(creditos.saldo) AS Saldo 
FROM         creditos 
GROUP BY creditos.id_detalle_venta)
:metal:
Sólo que si la misma cantidad de saldo está con otro registro, me va a traer resultados de más... Alguna idea?
 
Arriba