MySQL - Consulta peculiar

 
Vista:

Consulta peculiar

Publicado por David (11 intervenciones) el 15/05/2015 06:52:37
Hola,hago esta consulta por que la verdad no se como hacer una consulta en mysql,quiero que me salga los reclamos y respuestas durante un año,la duda es que solo puedo hacer una consulta a una sola tabla.

Busco algo similar a esta consulta.

1
SELECT count(Id_reclamo) as 'respuestas en el mes' FROM respuesta  WHERE Fecha_Respuesta BETWEEN DATE_ADD(NOW(), INTERVAL -1 month) AND NOW() ORDER BY Id_Respuesta DESC

Un saludo a todos.
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta peculiar

Publicado por leonardo_josue (414 intervenciones) el 15/05/2015 17:07:20
Hola David:

Tu problema no queda del todo claro, así es que antes que nada tendrías que aclararnos algunos puntos:

1. No nos dices cómo es la estructura de tu tabla, ni qué tipo de datos tienes en tu tabla, por lo tanto no podemos saber cómo distingues cuando se trata de una respuesta y cuando se trata de un reclamo.

2. Dices que buscas algo similar a esa consulta, pero en realidad ¿qué obtienes con esa consulta en particular? pasa lo mismo que con el punto 1, al no dar información adicional sobre tu tabla o tus datos es imposible saber qué es lo que estás obteniendo como resultado.

Partiendo del hecho de que sólo quieras obtener cuántos registros para cada año hay en una tabla con un campo tipo fecha, esta consulta es realmente básica, checa este ejemplo:

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
mysql> SELECT * FROM tabla;
+------+------------+
| id   | fecha      |
+------+------------+
|    1 | 2013-01-11 |
|    2 | 2013-02-21 |
|    3 | 2013-03-12 |
|    4 | 2014-04-05 |
|    5 | 2014-05-12 |
|    6 | 2015-06-27 |
|    7 | 2015-07-30 |
|    8 | 2015-08-06 |
+------+------------+
8 rows in set (0.00 sec)
 
mysql> SELECT YEAR(fecha) anio, COUNT(id) total
    -> FROM tabla
    -> GROUP BY YEAR(fecha);
+------+-------+
| anio | total |
+------+-------+
| 2013 |     3 |
| 2014 |     2 |
| 2015 |     3 |
+------+-------+
3 rows in set (0.00 sec)

No sé si esto sea lo que necesites, te pido que seas más especifico en cuanto a tu problema. Cuantos más detalles nos puedas proporcionar más factible será que podamos ayudarte.

Saludos
Leo.
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

Consulta peculiar

Publicado por David (11 intervenciones) el 15/05/2015 21:23:11
>1. No nos dices cómo es la estructura de tu tabla, ni qué tipo de datos tienes en tu tabla, por lo tanto no podemos saber cómo distingues cuando se trata de una respuesta y cuando se trata de un reclamo.

¿Que tipo de datos?

tabla_zpsjrw59rw2

>2. Dices que buscas algo similar a esa consulta, pero en realidad ¿qué obtienes con esa consulta en particular?


El número total de reclamos y respuesta desde la implementación del programa,lo que quiero en este caso es lo mismo pero en un año y con las dos tablas involucradas.
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
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta peculiar

Publicado por leonardo_josue (414 intervenciones) el 15/05/2015 22:17:52
Hola de nuevo David:

Ok, con los datos que incluyes ahora me quedan más dudas al respecto... porque estamos hablando de que hay dos campos de fecha, entonces ¿cuál es el que vas a utilizar para tu reporte? me explico con datos. Supongamos que en tus tablas tienes la siguiente información:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SELECT * FROM reclamos;
+------------+----------------+---------------+
| id_reclamo | reclamo        | fecha_reclamo |
+------------+----------------+---------------+
|          1 | reclamo uno    | 2014-12-31    |
|          2 | reclamo dos    | 2014-12-31    |
|          3 | reclamo tres   | 2014-12-31    |
|          4 | reclamo cuatro | 2015-01-01    |
|          5 | reclamo cinco  | 2015-01-01    |
+------------+----------------+---------------+
5 rows in set (0.00 sec)
 
mysql> SELECT * FROM respuestas;
+--------------+------------+---------------+---------------------+
| id_respuesta | id_reclamo | respuesta     | fecha_respuesta     |
+--------------+------------+---------------+---------------------+
|            1 |          1 | Respuesta 1.1 | 2014-12-31 00:00:00 |
|            2 |          1 | Respuesta 1.2 | 2014-12-31 00:00:00 |
|            3 |          2 | Respuesta 2.1 | 2014-12-31 00:00:00 |
|            4 |          2 | Respuesta 2.2 | 2015-01-01 00:00:00 |
|            5 |          3 | Respuesta 3.1 | 2015-01-01 00:00:00 |
|            6 |          3 | Respuesta 3.2 | 2015-01-01 00:00:00 |
|            7 |          4 | Respuesta 4.1 | 2015-01-01 00:00:00 |
+--------------+------------+---------------+---------------------+

es decir, en el año 2014 hubo 3 reclamos...

el reclamo = 1 tuvo dos respuestas, ambas en respuestas en el mismo año 2014
el reclamo = 2 tuvo dos respuestas, pero una respuesta se dió en el año 2014 y la otra en el 2015
el reclamo = 3 tuvo dos respuestas, pero ambas respuestas fueron en el año 2015

el año 2015 tuvo 2 reclamos

el reclamo = 4 tuvo una respuesta en el 2015
el reclamo = 5 no tuvo ninguna respuesta

con esta información ¿qué esperarías obtener como salida?

Una opción sería tomar sólo el año del reclamo y decir cuantas respuestas tuvieron esos reclamos, SIN IMPORTAR LA FECHA EN LA QUE SE HIZO ESA RESPUESTA. esto lo puedes obtener así:

Primero contabilizas cuantas respuestas tuvo cada reclamo:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT id_reclamo, COUNT(id_respuesta) total_respuestas
    -> FROM respuestas
    -> GROUP BY id_reclamo;
+------------+------------------+
| id_reclamo | total_respuestas |
+------------+------------------+
|          1 |                2 |
|          2 |                2 |
|          3 |                2 |
|          4 |                1 |
+------------+------------------+
4 rows in set (0.00 sec)

después haces un LEFT JOIN para agrupar por años y sumar las respuestas correspondientes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT
    ->    YEAR(reclamos.fecha_reclamo) anio,
    ->    COUNT(reclamos.id_reclamo) total_reclamos,
    ->    SUM(T1.total_respuestas) total_respuestas
    -> FROM reclamos
    -> LEFT JOIN
    -> ( SELECT id_reclamo, COUNT(id_respuesta) total_respuestas
    ->   FROM respuestas
    ->   GROUP BY id_reclamo) T1
    -> ON reclamos.id_reclamo = T1.id_reclamo
    -> GROUP BY YEAR(fecha_reclamo);
+------+----------------+------------------+
| anio | total_reclamos | total_respuestas |
+------+----------------+------------------+
| 2014 |              3 |                6 |
| 2015 |              2 |                1 |
+------+----------------+------------------+
2 rows in set (0.00 sec)

Observa que la subconsulta T1 es la que puse al inicio.

Dale un vistazo para ver si es lo que necesitas.

Saludos
Leo.
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

Consulta peculiar

Publicado por David (11 intervenciones) el 15/05/2015 23:44:27
>Ok, con los datos que incluyes ahora me quedan más dudas al respecto... porque estamos hablando de que hay dos campos de fecha, entonces ¿cuál es el que vas a utilizar para tu reporte?

Esto era un dolor de cabeza que tenía al pensar en como hacer la sentencia.

>con esta información ¿qué esperarías obtener como salida?
Algo parecido a la solución que has dado,pero pensé en que incluir las fechas era algo vital.


Muchas gracias,la opción que has puesto me ha dejado satisfecho,un saludo.
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

Consulta peculiar

Publicado por David (11 intervenciones) el 16/05/2015 00:18:16
Amigo he estado modificando tu consulta original ahora por meses,la cuestión es como ordenar los meses en el orden del más reciente,no se si es posible,ya que me salen en desorden,disculpa una vez más.
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
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta peculiar

Publicado por leonardo_josue (414 intervenciones) el 18/05/2015 18:24:34
Hola de Nuevo David:

No sé como estás incluyendo el mes en la consulta, pero trata de hacer algo como esto:

1
2
...
ORDER BY YEAR(Fecha_reclamo) desc, MONTH(Fecha_reclamo) desc;

Esto de debería ordenar por el mes y año más reciente.

Haz la prueba, si continuas con problemas postea el código que estás ejecutando y lo checamos.

Saludos
Leo.
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

Consulta peculiar

Publicado por David (11 intervenciones) el 18/05/2015 20:56:56
Muchas gracias ha funcionado tu consulta,un saludo.
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

Consulta peculiar

Publicado por David (11 intervenciones) el 18/05/2015 21:58:52
Tengo la siguiente interrogante;¿que pasaría si pasan dos años,lo meses se repetirían sin poder saber a que año pertenecen?
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
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta peculiar

Publicado por leonardo_josue (414 intervenciones) el 18/05/2015 22:19:42
Hola de nuevo David:

Antes que nada, una recomendación. Cuando quieras hacer una nueva pregunta, HAZLO DESDE UNA NUEVA ENTRADA, es decir, no continues con un post que ya se haya respondido. En la nueva entrada puedes agregar una liga hacia tus otros post's, pero no es correcto tratar más de un tema en una entrada del foro.

Ojo para la próxima.

con respecto a tu pregunta:

1
¿que pasaría si pasan dos años,lo meses se repetirían sin poder saber a que año pertenecen?

Todo depende de cómo estés agrupando o cómo estés filtrando tus datos. Si en el GROUP BY estás considerando tanto el mes como el año, entonces no debes tener problemas, si sólo tomas el mes entonces DEBERÁS FILTRAR QUE SÓLO SE EXTRAIGAN LOS DATOS DE UN AÑO EN ESPECÍFICO. Supongamos que tienes esta tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT * FROM tabla;
+------+------------+
| id   | fecha      |
+------+------------+
|    1 | 2014-01-01 |
|    2 | 2014-01-02 |
|    3 | 2014-01-03 |
|    4 | 2014-02-04 |
|    5 | 2014-02-05 |
|    6 | 2015-01-06 |
|    7 | 2015-01-07 |
|    8 | 2015-01-08 |
|    9 | 2015-02-09 |
|   10 | 2015-02-10 |
+------+------------+
10 rows in set (0.00 sec)

Hay registros para los meses 1 y 2 (Enero y Febrero) pero para dos años distintos (2014 y 2015). Si agrupas SÓLO POR EL MES, entonces MEZCLA LOS REGISTROS DE AMBOS AÑOS.

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT MONTH(fecha), COUNT(id)
    -> FROM tabla
    -> GROUP BY MONTH(fecha)
    -> ORDER BY MONTH(fecha) DESC;
+--------------+-----------+
| MONTH(fecha) | COUNT(id) |
+--------------+-----------+
|            2 |         4 |
|            1 |         6 |
+--------------+-----------+
2 rows in set (0.00 sec)

Si agrupas POR AÑO Y POR MES, entonces NO SE MEZCLAN LOS REGISTROS DE LOS AÑOS.


1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT YEAR(fecha), MONTH(fecha), COUNT(id)
    -> FROM tabla
    -> GROUP BY YEAR(fecha), MONTH(fecha)
    -> ORDER BY YEAR(fecha) DESC, MONTH(fecha) DESC;
+-------------+--------------+-----------+
| YEAR(fecha) | MONTH(fecha) | COUNT(id) |
+-------------+--------------+-----------+
|        2015 |            2 |         2 |
|        2015 |            1 |         3 |
|        2014 |            2 |         2 |
|        2014 |            1 |         3 |
+-------------+--------------+-----------+
4 rows in set (0.00 sec)

Si se agrupa SÓLO POR AÑO, entonces SE MEZCLAN LOS MESES...

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT YEAR(fecha), COUNT(id)
    -> FROM tabla
    -> GROUP BY YEAR(fecha)
    -> ORDER BY YEAR(fecha) DESC;
+-------------+-----------+
| YEAR(fecha) | COUNT(id) |
+-------------+-----------+
|        2015 |         5 |
|        2014 |         5 |
+-------------+-----------+
2 rows in set (0.00 sec)

Se entiende?

Saludos
Leo.
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

Consulta peculiar

Publicado por David (11 intervenciones) el 18/05/2015 22:39:16
Muchísimas gracias,he hecho algunos ajustes de lo que has puesto y ha salido la consulta que he buscado,lo de hacer varias preguntas en el mismo post no volverá a pasar.

¡Un saludo!
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