MySQL - Ing. en Sistemas

 
Vista:

Ing. en Sistemas

Publicado por Jose Carlos (7 intervenciones) el 23/08/2012 17:37:24
Hola a todos, tengo una duda con una consulta que me está volviendo loco, es una consulta a una sola tabla llamada "pr_saldos_plan_pago_mes" la idea es filtrar el campo "numero_prestamo" con sus respectivos datos que concuerden con la consulta, así no se repetirá el "numero_prestamo" y arrojará los valores seleccionados, mi problema es al tratar de filtrar el campo "codigo_tipo_saldo", que me arroje el dato de la misma linea de mi consulta, pero es el único que no concuerda, siempre me arroja el primer valor encontrado en la base de datos, y no tiene relación con la línea seleccionada, a continuación les adjunto una imagen para que me puedan entender mejor.

El rectángulo rojo es la línea que necesito sacar, todo sale sin problemas, a excepción del último dato, intenté con subconsultas, joins y consultas normales agrupadas y nada me resulta, necesito el dato del círculo amarillo, y me arroja el círculo azul, me quiero volver chango!!!!
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

Ing. en Sistemas

Publicado por Jose Carlos (7 intervenciones) el 23/08/2012 17:39:58
disculpen el título me equivoqué y no puedo modificar la nota, soy nuevo en este foro
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
sin imagen de perfil

Ing. en Sistemas

Publicado por Ignacio Esviza (6 intervenciones) el 23/08/2012 18:03:42
José:

Mmmm... si por favor pegaras acá las sentencias SQL tal como las estás usando sería de mayor ayuda, porque no se visualizan completos.

A priori, por lo que pude ver, creo que estás confundiendo algunos conceptos. Si usás alguna función de agrupamiento entre las columnas solicitadas (MAX, etc) ya SQL te va a intentar responder según el grupo que arme. Aquellas columnas que tengan valores distintos y que no las agrupes, te van a dar resultados inesperados.

Para ejemplificar lo que te está pasando, imaginá esto:

1. Una tabla "poblacion" con la estructura:

pais, provincia, habitantes

2. Imaginá estos valores:

1, 1, 500
1, 2, 100
1, 3, 600
1, 4, 800

3. Ahora imaginá que pedís estos SQL:

SELECT pais, MAX( provincia ), habitantes FROM poblacion GROUP BY pais;

El resultado está claro para la columna pais (que será "1") y para el max(provincia) que será "4", pero no está tan claro qué te va a responder para habitantes. Qué número pensás que te da? La respuesta es: no se sabe. Te va a dar cualquiera de los valores de habitantes, porque tiene más de un valor para un único resultado.

Revisá los agrupamientos que estás haciendo y pensá siempre que podés no pegarle con un sólo SQL sino que quizás debas resolver una parte con un SQL y otra con otro SQL.

Saludos
Ignacio
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

Ing. en Sistemas

Publicado por Jose Carlos (7 intervenciones) el 23/08/2012 18:26:58
Gracias por la ráida repsuesta, no se por que no se visualiza la imagen, pero pego el script a continuación:

consulta con todos los datos:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
numero_prestamo	numero_cuota	periodo	codigo_tipo_saldo
1		140		-1	1
1		140		-1	53
1		140		-1	55
1		140		-1	2
1		140		-1	6
1		141		0	1
1		141		0	2
1		141		0	23
1		141		0	6
1		141		0	53
1		141		0	55
1		142		1	1
1		142		1	2
1		142		1	6
1		142		1	53
1		142		1	55
1		143		2	1
1		143		2	55
1		143		2	53
1		143		2	2
1		143		2	6
1		144		3	2
1		144		3	6
1		144		3	55
1		144		3	53
1		144		3	1
1		145		5	2
1		145		5	79
1		145		4	1
1		145		5	53
1		145		5	55
1		145		5	1
1		145		5	37
1		145		4	53
1		145		5	84
1		145		5	44
1		145		4	2
1		145		5	6
1		145		4	55
1		145		4	6
1		146		6	44
1		146		5	1
1		146		6	37
1		146		6	6
1		146		5	6
1		146		6	83
1		146		5	53
1		146		6	1
1		146		5	2
1		146		6	55
1		146		6	53
1		146		5	55
1		146		6	79
1		146		6	2
1		146		6	84
1		147		6	6
1		147		6	1
1		147		6	55
1		147		7	6
1		147		7	2
1		147		7	44
1		147		7	84
1		147		6	2
1		147		7	55
1		147		7	53
1		147		7	83
1		147		7	37
1		147		7	79
1		147		7	1
1		147		6	53
1		148		8	53
1		148		8	83
1		148		8	2
1		148		7	53
1		148		7	1
1		148		8	1
1		148		8	79
1		148		7	2
1		148		8	37
1		148		8	44
1		148		7	6
1		148		8	84
1		148		8	55
1		148		7	55
1		148		8	6
1		149		8	6
1		149		8	2
1		149		8	55
1		149		8	1
1		149		8	53
1		150		9	1
1		150		10	84
1		150		9	55
1		150		10	53
1		150		10	55
1		150		10	44
1		150		9	53
1		150		10	79
1		150		10	83
1		150		10	37
1		150		10	1
1		150		10	2
1		150		10	6
1		150		9	6
1		150		9	2
1		153		12	53


ahora viene lo divertido hehe, lo que quiero sacar es por así decirlo la última línea "1 153 12 53" con la consulta que relaizo puedo sacar los primeros datos, sin embargo el "53" de "codigo_tipo_saldo" no lo agrupa a esa línea, de hecho me manda siempre el primero que es "1", la consulta que realicé fué esta, y estos son los resultados:


SELECT numero_prestamo, Max(numero_cuota) AS ultima_cuota, Max(numero_cuota)+1 AS siguiente_cuota, Max(periodo) AS ultimo_periodo, codigo_tipo_saldo FROM pr_saldos_plan_pago_mes where numero_prestamo = 1 GROUP BY numero_prestamo

1
2
numero_prestamo	ultima_cuota	siguiente_cuota	ultimo_periodo	codigo_tipo_saldo
1		153		154		12		1


ese "1" de al final me vuelve loco!!! en realidad el resultado que espero es el siguiente:

1
2
numero_prestamo	ultima_cuota	siguiente_cuota	ultimo_periodo	codigo_tipo_saldo
1		153		154		12		53


muchas gracias por su atención de antemano :)
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

Ing. en Sistemas

Publicado por Jose Carlos (7 intervenciones) el 23/08/2012 18:52:06
cabe destacar que intenté la siguiente consulta, tratando de agrupar ese dato:

1
2
3
4
5
SELECT numero_prestamo, Max(numero_cuota) AS ultima_cuota, Max(numero_cuota)+1
AS siguiente_cuota, Max(periodo) AS ultimo_periodo, (Select codigo_tipo_saldo from
pr_saldos_plan_pago_mes where numero_cuota=Max(numero_cuota) order by 1 Desc limit 1)
as codigo_tipo_saldo FROM pr_saldos_plan_pago_mes where numero_prestamo = 1
GROUP BY numero_prestamo


pero me manda el error:

Lookup Error - MySQL Database Error: Invalid use of group function

traté de quitarme el group de al final, pero no sirve, el error lo marca entrando a la subconsulta
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
sin imagen de perfil

Ing. en Sistemas

Publicado por Ignacio Esviza (6 intervenciones) el 24/08/2012 14:15:20
Te estás enredando en algo que es fácil, pero vos querés complicarla haciéndolo todo en un solo SQL.

Suponiendo que en tu SQL admita subconsultas ( MySQL admite subconsultas, por ejemplo ):

1. Una alternativa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
   plan.numero_prestamo,
   plan.numero_cuota,
   plan.numero_cuota+1 AS proxima_cuota,
   plan.periodo,
   plan.codigo_tipo_saldo
FROM
   pr_saldos_plan_pago_mes plan
WHERE
   plan.numero_prestamo = 1 AND
   plan.numero_cuota IN
      ( SELECT
            MAX( numero_cuota ) AS ultima_cuota
        FROM
            pr_saldos_plan_pago_mes
        WHERE
            numero_prestamo = 1 )


2. O bien otra alternativa (ojo la estoy escribiendo a mano y no la pruebo, fijate si hay q cambiarla, pero creo que va):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
   plan.numero_prestamo,
   sub.ultima_cuota,
   sub.ultima_cuota+1 AS proxima_cuota,
   sub.periodo,
   plan.codigo_tipo_saldo
FROM
   pr_saldos_plan_pago_mes plan,
   ( SELECT
         numero_prestamo,
         MAX( numero_cuota ) AS ultima_cuota,
         MAX( periodo ) AS ultimo_periodo
     FROM
         pr_saldos_plan_pago_mes
     WHERE
         numero_prestamo = 1 ) sub
WHERE
   plan.numero_prestamo = sub.numero_prestamo AND
   plan.numero_cuota = sub.ultima_cuota



...y leé el mail que te escribí antes y tratá de entenderlo. Es *OBVIO* que te sale el "1" porque ese dato no tiene cómo sacarlo el SQL.

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
sin imagen de perfil

Ing. en Sistemas

Publicado por Ignacio Esviza (6 intervenciones) el 24/08/2012 14:20:06
....y más alternativas:

En MySQL es muy fácil tomar una sola línea:

1
2
3
4
5
6
7
8
9
SELECT *
FROM
   pr_saldos_plan_pagos
WHERE
   numero_prestamo = 1
ORDER BY
   numero_cuota DESC
LIMIT
   1


...y ahí ya tenés la info.
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

Ing. en Sistemas

Publicado por Jose Carlos (7 intervenciones) el 28/08/2012 16:54:34
wowwwwww, exactamente era lo que buscaba, la primer consulta fue la que mejor me resultó lo que esperaba, la segunda también funciona ya mas filtrada y la tercera me abrio los ojos con el "limit" que nunca uso, si bien no me arrojo el último dato, me arrojo perfectamente ordenados los últimos que tienen que ver con el numero de cuota "153" me los repite ya que hay varios con ese número de cuota, pero no hay problema ya solo me falta investigar cono seleccionar esa última línea, sin embargo puedo utilizar la consulta así por ahora, en verdad muchas gracias por tomarte tu tiempo y responderme pronto, estaba viendo otro proyecto que tenía que entregar ayer y por eso no me pude conectar, pero se agradece su tiempo, para que vean los que andes investigando algo similar los resultandos fueron los siguientes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
   plan.numero_prestamo,
   plan.numero_cuota,
   plan.numero_cuota+1 AS proxima_cuota,
   plan.periodo,
   plan.codigo_tipo_saldo
FROM
   pr_saldos_plan_pago_mes plan
WHERE
   plan.numero_prestamo = 1 AND
   plan.numero_cuota IN
      ( SELECT
            MAX( numero_cuota ) AS ultima_cuota
        FROM
            pr_saldos_plan_pago_mes
        WHERE
            numero_prestamo = 1 )


resultado:

1
2
3
4
5
6
numero_prestamo	numero_cuota	proxima_cuota	periodo	codigo_tipo_saldo
1		153		154		12	55
1		153		154		12	6
1		153		154		12	2
1		153		154		12	53
1		153		154		12	1


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