Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Consulta agrupar por ID

Estas en el tema de Consulta agrupar por ID en el foro de Mysql en Foros del Web. Buenas a todos, Primero quiero dar las gracias de antemano por la ayuda que me podáis ofrecer. Mi duda/consulta es la siguiente. A través de ...
  #1 (permalink)  
Antiguo 28/01/2013, 16:42
 
Fecha de Ingreso: julio-2011
Mensajes: 7
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Consulta agrupar por ID

Buenas a todos,

Primero quiero dar las gracias de antemano por la ayuda que me podáis ofrecer. Mi duda/consulta es la siguiente.

A través de esta consulta:
Código MySQL:
Ver original
  1. SELECT id_instalacion, COUNT( * ) AS disponibles
  2.     SELECT *
  3.     FROM `reservas`
  4.     WHERE `fecha_entrada`
  5.     BETWEEN '2013-01-25'
  6.     AND '2013-01-27'
  7.     OR `fecha_salida`
  8.     BETWEEN '2013-01-25'
  9.     AND '2013-01-27'
  10. ) AS t
  11. GROUP BY id_instalacion
  12. SELECT id_instalacion, cantidad FROM instalacion
  13. ORDER BY id_instalacion
Obtengo estos resultado:

Código MySQL:
Ver original
  1. id_instalacion     disponibles
  2.      1               3
  3.      1              10
  4.      2              1
  5.      2              10
  6.      3              10
  7.      4              10
  8.      5              10
  9.      6              10
  10.      7              4
O también puedo conseguir (con el -COUNT() ), lo siguiente:

Código SQL:
Ver original
  1. id_instalacion     disponibles
  2.      1               -3
  3.      1              10
  4.      2              -1
  5.      2              10
  6.      3              10
  7.      4              10
  8.      5              10
  9.      6              10
  10.      7              4
El caso es que me gustaría saber si ha alguna manera de poder agrupar por 'id_instalacion', es decir que solo aparezca un registro de cada 'id_instalacion', pero restando los valores de la columna 'disponibles'. En este ejemplo de resultados sería algo así:

Código MySQL:
Ver original
  1. id_instalacion     disponibles
  2.      1              7
  3.      2              9
  4.      3              10
  5.      4              10
  6.      5              10
  7.      6              10
  8.      7              4
También decir que no solo pasaría con las dos primeras instalaciones, sino que podría haber un registro repetido de cada. Es si, solo se repetirá una vez por que agrupo las instalaciones reservadas para esas fechas.

He intentado explicarme con la mayor claridad posible, espero que se entienda un poco la idea de lo que intento conseguir. Si no, preguntarme por favor. A ver si alguien puede echarme un cable lo antes posible, muchas gracias de nuevo a todos. Saludos.

Última edición por gnzsoloyo; 28/01/2013 a las 18:16 Razón: SQL mal etiquetado.
  #2 (permalink)  
Antiguo 28/01/2013, 18:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta agrupar por ID

Creo que estás complicando innecesariamente la consulta.
Si Instalaciones depende de Reserva, como parece, lo que correspondería hacer es un INNER JOIN, que te devolvería el resultado buscado.
Por supuesto que estoy suponiendo que esas dos tablas están relacionadas entre sí por medio de un campo llamado id_instalacion, y que la tabla Reservas contiene todos los pedidos o algo así, mientras que Instalaciones contendría los trabajos efectivamente realizados.
Eso podría dar un resultado como:
Código MySQL:
Ver original
  1. SELECT R.id_instalacion, (SUM(1) - SUM(I.cantidad)) disponibles
  2. FROM reservas INNER JOIN instalaciones ON R.id_instalacion = I.id_instalacion
  3.     (R.fecha_entrada BETWEEN '2013-01-25' AND '2013-01-27')
  4.     OR (fecha_salida BETWEEN '2013-01-25' AND '2013-01-27')
  5. GROUP BY R.id_instalacion;

Obviamente, si mis suposiciones no son correctas tendrás que decirnos qué es lo que se supone que representa cada tabla y qué tipo de resumen estás tratando de obtener de ellas.

Lo que si te puedo afirmar es que el planteo de consulta que haces no resulta optimizado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 29/01/2013, 15:58
 
Fecha de Ingreso: julio-2011
Mensajes: 7
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Consulta agrupar por ID

Tienes razón, la sentencia es un poco rebuscada pero hace casi lo que intento hacer. Lo que ha partir de aquí ya no se como restar o que hacer para conseguir lo que pregunto.

He probado tu consulta y me muestra unos resultados que no se bien bien lo que son. Muchas gracias por ayudarme.

Te comento un poco mejor a lo que me refiero a ver si entre todos lo conseguimos.
Tengo una tabla 'instalacion' donde guardo lo que se podría llamar inventario de instalaciones. Es decir, hay un listado de 8 instalaciones predeterminadas con un campo 'cantidad' que son las totales. Entonces al hacer la sentencia cuento dentro de esas fechas y para todas las instalaciones que hay reservadas en ese momento he intento sacar las restantes, es decir, todas las que están disponibles para ese rango de fechas de la reserva.

Un ejemplo: si dentro del rango de fechas que el usuario introduce el usuario hay 3 reservas de la primera instalación, y en el inventario (tabla 'instalacion') la 'cantidad' es 10, quiero montar una consulta que me haga la resta y muestre 7. Pero esto con todas las instalaciones.
De aquí que os pusiera un ejemplo mas visual. Lo vuelvo a poner a ver si se ve mas claro.

El primer registro de cada instalación digamos que no es realmente lo que dice el nombre de la columna, son las que hay reservadas en ese momento. Entonces la idea es restar este primer registro de cada 'id_instalacion' (reservadas) con el segundo (nº de instalaciones totales) y conseguir las disponibles.
Resultado de la sentencia (he conseguido las dos maneras):
Código MySQL:
Ver original
  1. id_instalacion     disponibles          id_instalacion     disponibles
  2.      1              3                      1               -3
  3.      1              10                     1              10
  4.      2              1                      2              -1
  5.      2              10                     2              10
  6.      3              10                     3              10
  7.      4              10                     4              10
  8.      5              10                     5              10
  9.      6              10                     6              10
  10.      7              4                      7              4

Haciéndolo de alguna manera, quier conseguir restar ese 3-10 o 1-10 pero para todas las instalaciones. En este caso solo hay reservas para las dos primeras instalaciones, pero podrían ser todas. Intento conseguir esto:
Código MySQL:
Ver original
  1. id_instalacion     disponibles
  2.      1              7
  3.      2              9
  4.      3              10
  5.      4              10
  6.      5              10
  7.      6              10
  8.      7              4

Perdona los 'tochos' de explicaciones, pero necesito hacerlo lo antes posible e intento explicarme lo mejor que puedo para que me podáis ayudar.

Muchas gracias de nuevo!
  #4 (permalink)  
Antiguo 29/01/2013, 16:41
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta agrupar por ID

Hola kirianky:

No termino de entender cómo tienes organizada tu información... creo que debiste de haber comenzado por ahi, pero tratando de jugar al adivino, creo que tendrías algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM instalacion;
  2. +----------------+----------+
  3. | id_instalacion | cantidad |
  4. +----------------+----------+
  5. |              1 |       10 |
  6. |              2 |        8 |
  7. |              3 |        7 |
  8. |              4 |        5 |
  9. +----------------+----------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM reservas;
  13. +----------------+---------------+--------------+
  14. | id_instalacion | fecha_entrada | fecha_salida |
  15. +----------------+---------------+--------------+
  16. |              1 | 2013-01-25    | 2013-01-25   |
  17. |              1 | 2013-01-25    | 2013-01-25   |
  18. |              2 | 2013-01-25    | 2013-01-25   |
  19. |              2 | 2013-01-25    | 2013-01-25   |
  20. |              3 | 2013-01-25    | 2013-01-25   |
  21. |              3 | 2013-01-25    | 2013-01-25   |
  22. |              3 | 2013-01-25    | 2013-01-25   |
  23. +----------------+---------------+--------------+
  24. 7 rows in set (0.00 sec)

Suponiendo que en tu tabla de instalaciones tengas sólo una entrada para cada id_instalación, y en tu tabla reservas tienes que contar primero, entonces podrías hacerlo asi:

Código MySQL:
Ver original
  1. mysql> SELECT T1.id_instalacion,
  2.     -> T1.cantidad - IFNULL(T2.reservadas, 0) disponibles
  3.     -> FROM instalacion T1 LEFT JOIN
  4.     -> ( SELECT id_instalacion, COUNT(id_instalacion) reservadas
  5.     ->   FROM reservas
  6.     ->   WHERE fecha_entrada BETWEEN '2013-01-25' AND '2013-01-27' OR
  7.     ->         fecha_salida BETWEEN '2013-01-25' AND '2013-01-27'
  8.     ->   GROUP BY id_instalacion) T2 ON T1.id_instalacion = T2.id_instalacion;
  9. +----------------+-------------+
  10. | id_instalacion | disponibles |
  11. +----------------+-------------+
  12. |              1 |           8 |
  13. |              2 |           6 |
  14. |              3 |           4 |
  15. |              4 |           5 |
  16. +----------------+-------------+
  17. 4 rows in set (0.00 sec)

Dale un vistazo y si continuas con problemas lo comentas en el foro

Saludos
Leo.
  #5 (permalink)  
Antiguo 29/01/2013, 17:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta agrupar por ID

Bueno, por lo mismo que te dice leonardo_josue, yo te aclaré que estaba suponiendo la existencia de una relación.
Creo que el ejemplo demostrado que te pone es suficientemente entendible para la idea que interpretamos de lo que tienes... Al menos hasta que nos aclares esos detalles.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 30/01/2013, 08:43
 
Fecha de Ingreso: julio-2011
Mensajes: 7
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Consulta agrupar por ID

UN MILLóN DE GRACIAS leonardo_josue!

Exactamente era esto lo que intentaba mostrar con mi consulta... Probé el 'LEFT JOIN' pero una de dos, o no supe usarlo o no hacia bien la consulta. Aun así, ahora ya tengo la tabla 'virtual' que buscaba con tu consulta.

Y gracias también a gnzsoloyo también por tu ayuda, y lo siento por no haber puesto en el primer post la estructura del una parte de la BBDD, pero habéis supuesto perfectamente lo que tengo y lo que buscaba conseguir.

Doy gracias de nuevo por las ayudas! Sois unos cracks! :D

Saludos

Etiquetas: agrupar, registros, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:37.