SQL - Busquedas sin repetición Sql Server

 
Vista:

Busquedas sin repetición Sql Server

Publicado por Matias (5 intervenciones) el 26/03/2019 01:02:45
Hola gente, la consulta es la siguiente:

Tengo una tabla donde quiero obtener el resultado de solo aquellos clientes que tengan un atraso de hasta 20 días en el pago de sus cuotas (teniendo en cuenta que pagan mas de una cuota de una compra en distintos meses).

Tengo lo siguiente:

NroCliente Cuota Monto Atraso
2 1 500 5
2 2 500 2
2 3 500 30
3 1 750 5
3 2 750 6
3 3 750 10
4 1 600 6
4 2 600 40
5 1 350 1
5 1 350 3

En este caso mi consulta me debería devolver:

NroCliente Monto
3 500
5 350

Solo estos dos clientes que son aquellos que No se atrasaron mas de 20 días en el pago de sus cuotas.

He probado con inner join, distinct, etc..Sin exito!

Agradezco si alguien me puede dar una mano con esto.

Muchas Gracias!
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
Imágen de perfil de gilman
Val: 181
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Busquedas sin repetición Sql Server

Publicado por gilman (67 intervenciones) el 26/03/2019 08:42:38
prueba
1
WHERE atraso > 20
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

Otra vez con mi consulta

Publicado por Matias (5 intervenciones) el 26/03/2019 11:59:34
Gracias Gilman, he probado todo las sentencias de union, como inner, left ovbiamente con where, pero en este caso solo me tiene que devolver los que no se hayan atrasado en ninguna cuota
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
Imágen de perfil de gilman
Val: 181
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Otra vez con mi consulta

Publicado por gilman (67 intervenciones) el 26/03/2019 13:24:18
Perdona, no me había quedado claro lo que querías, prueba
1
2
3
4
5
SELECT DISTINCT NroCliente, Monto
  FROM tabla
 WHERE NroCliente NOT IN (SELECT NroCliente
                            FROM tabla
                           WHERE atraso > 20)
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

Otra vez con mi consulta

Publicado por Matias (5 intervenciones) el 26/03/2019 13:57:32
Gracias gilman, en principio probé y funcionaria, el tema es que me aparecen repetidos de acuerdo la cantidad de cuotas que pago el cliente

Me interesaría que aparezca así:

NroCliente Monto
3 500
5 350

Gracias!
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
Imágen de perfil de gilman
Val: 181
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Otra vez con mi consulta

Publicado por gilman (67 intervenciones) el 26/03/2019 17:19:06
Con los datos aportados si ejecutas la consulta que te paso el resultado debería ser:
NroCliente Monto
3 750
5 350

ya que los montos son siempre los mismos para cada cliente, con lo que no habría mas de una fila distinta por cliente, si los datos originales fuesen:
NroCliente Cuota Monto Atraso
2 1 500 5
2 2 500 2
2 3 500 30
3 1 750 5
3 2 500 6
3 3 750 10
4 1 600 6
4 2 600 40
5 1 200 1
5 1 350 3
Los resultados, como es lógico, serían:
NroCliente Monto
3 750
3 500
5 200
5 350

Pero si queremos que aparezca solo una vez cada cliente, queda por definir que monto queremos recuperar, ordennando por cuota¿el primer monto?, ¿el último?, ¿el mayor?, ¿el menor?, ¿la suma?, ...
una vez respondido eso podemos plantear que sentencia debemos emplear.
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

Otra vez con mi consulta

Publicado por Matias (5 intervenciones) el 27/03/2019 00:32:11
Gracias gilman, si tal cual la consulta funciona, la idea es que no se repitan, con que aparezca el primero de cada uno seria suficiente.
También lo enlace con un inner join ya que tengo otra tabla con datos similares a esto:

NroCliente Apellido Mail
2 aaa
3 bbb
4 ccc
5 ddd

La idea es que la consulta devuelva algo así:
NroCliente Monto Apellido
3 750 bbb
5 350 ddd

Tu ayuda me sirvió de mucho, ahora tengo que ver la posibilidad que aparezcan sin repetición. 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
Imágen de perfil de Vega
Val: 181
Ha disminuido 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Busquedas sin repetición Sql Server

Publicado por Vega (69 intervenciones) el 26/03/2019 13:22:05
Hola Matias,
Perdona pero no consigo comprender los resultados que esperas conseguir.

Según los registros de tu tabla, el nroClient 3 tiene una deuda acumulada de 750 por Cuota, no 500.

¿cómo llegas a 500, o es que en realidad te refieres a nroClient 2?

Asúmo que estás usando SQL Server.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
DECLARE @datos TABLE (
	NroCliente		INT
,	Cuota			INT
,	Monto			MONEY
,	Atraso			INT
)
 
INSERT INTO @DATOS VALUES
(2, 1, 500, 5 	),
(2, 2, 500, 2	),
(2, 3, 500, 30	),
(3, 1, 750, 5 	),
(3, 2, 750, 6	),
(3, 3, 750, 10	),
(4, 1, 600, 6	),
(4, 2, 600, 40	),
(5, 1, 350, 1	),
(5, 1, 350, 3	)
;
WITH	DatosOrdenados AS (
SELECT	NroCliente
,		Cuota
,		Monto
,		Atraso
,		AtrasosOrdenados = ROW_Number () OVER (PARTITION BY nroCliente, Monto ORDER BY Cuota DESC)
FROM	@datos
)
SELECT	NroCliente
,		Monto
FROM	DatosOrdenados
WHERE	AtrasosOrdenados = 1
	AND Atraso <= 20
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

Busquedas sin repetición Sql Server

Publicado por Matias (5 intervenciones) el 26/03/2019 14:04:33
Hola Vega! gracia por tu ayuda.

Si tal vez me exprese mas, son clientes que pagan cuotas fijas, 3, 6, 9, 12 cuotas depende la compra ejemplo corregido:

NroCliente Cuota Monto Atraso
2 1 500 5
2 2 500 2
2 3 500 30
3 1 750 5
3 2 750 6
3 3 750 10
4 1 600 6
4 2 600 40
5 1 350 1
5 1 350 3

En este caso mi consulta me debería devolver:

NroCliente Monto
3 750
5 350

Solo los clientes que no se hallan atrasado nunca en ninguna cuota sin repetición, también hay que tener en cuenta que el mismo cliente puede tener hechas varias compras, en el caso que en una de esas compras se halla atraso al menos una cuota ya NO lo debería mostrar.
Espero ser claro, y gracias nuevamente!
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
Imágen de perfil de Vega
Val: 181
Ha disminuido 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Busquedas sin repetición Sql Server

Publicado por Vega (69 intervenciones) el 26/03/2019 14:48:58
En ese caso creo que la consulta que te he dado soluciona to problema.

La function Row_number() particional las deudas por cliente y monto.

si no puedes ejecutar la sentencia WITH desde tu cliente re-organiza la consulta con un JOIN así:

1
2
3
4
5
6
7
8
9
10
11
SELECT	NroCliente
,		Monto
FROM (
SELECT	NroCliente
,		Cuota
,		Monto
,		Atraso
,		AtrasosOrdenados = ROW_Number () OVER (PARTITION BY nroCliente, Monto ORDER BY Cuota DESC)
FROM	@datos) DatosOrdenados
WHERE	AtrasosOrdenados = 1
	AND Atraso <= 20

El resultado es
NroCliente Monto
3 750
5 350
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