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

GROUP BY & BETWEEN en una sola consulta

Estas en el tema de GROUP BY & BETWEEN en una sola consulta en el foro de Mysql en Foros del Web. Hola amigos tengo una consulta sql en donde quiero saber cuantos registros hay de cada tipo, eso lo hago con el GROUP BY y funciona ...
  #1 (permalink)  
Antiguo 24/05/2012, 12:48
 
Fecha de Ingreso: enero-2010
Ubicación: Colombia
Mensajes: 238
Antigüedad: 14 años, 2 meses
Puntos: 2
GROUP BY & BETWEEN en una sola consulta

Hola amigos tengo una consulta sql en donde quiero saber cuantos registros hay de cada tipo, eso lo hago con el GROUP BY y funciona bien, pero ahora tengo que consultar los registros por rango fecha el cual lo hago con BETWEEN y al añadirlo en la misma consulta solo me muestra una sola fila de registro pero no entiendo por que . Quiero saber si el GROUP BY y el BETWEEN son compatibles en una sola consulta sql. Dejo el codigo para una mejor explicacion:

Cita:
Consulta sin BETWEEN:
Código PHP:
 $sql="SELECT COUNT(dtalle_lic),licencias.dtalle_lic,tbl_licencias.cod_licencia,tbl_licencias.cod_fun,fun.cod_fun,fun.cod_lic, 
                             licencias.cod_lic,licencias.dtalle_lic,tbl_licencias.fecha_lic, 
                             tbl_licencias.cod_exp,expensas.cod_exp,expensas.total,SUM(expensas.total) as suma              
            
              FROM tbl_licencias,fun,licencias,expensas 
            
              WHERE tbl_licencias.cod_fun=fun.cod_fun AND fun.cod_lic=licencias.cod_lic AND tbl_licencias.cod_exp=expensas.cod_exp 
                    GROUP BY dtalle_lic    
                          
                      "

Cita:
Consulta con BETWEEN:
Código PHP:
 $sql="SELECT COUNT(dtalle_lic),licencias.dtalle_lic,tbl_licencias.cod_licencia,tbl_licencias.cod_fun,fun.cod_fun,fun.cod_lic, 
                             licencias.cod_lic,licencias.dtalle_lic,tbl_licencias.fecha_lic, 
                             tbl_licencias.cod_exp,expensas.cod_exp,expensas.total,SUM(expensas.total) as suma              
            
              FROM tbl_licencias,fun,licencias,expensas 
            
              WHERE tbl_licencias.cod_fun=fun.cod_fun AND fun.cod_lic=licencias.cod_lic AND tbl_licencias.cod_exp=expensas.cod_exp 
                    GROUP BY dtalle_lic AND fecha_lic BETWEEN '2012-01-01' AND '2012-05-23'   
                          
                      "

Este es el resultado de las consultas:

  #2 (permalink)  
Antiguo 24/05/2012, 13:13
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: GROUP BY & BETWEEN en una sola consulta

El BETWEEN s una cláusula para el WHERE, no para el GROUP BY.
El sentido no es agrupar, sino discriminar registros que cumplan la condición.

Además, necesitas estudiar el uso de JOIN, esepcialmente el INNER JOIN, y sobre alias.
Código MySQL:
Ver original
  1.     COUNT(dtalle_lic),
  2.     L.dtalle_lic,
  3.     TL.cod_licencia,
  4.     TL.cod_fun,
  5.     F.cod_fun,
  6.     F.cod_lic,
  7.     L.cod_lic,
  8.     L.dtalle_lic,
  9.     TL.fecha_lic,
  10.     TL.cod_exp,
  11.     E.cod_exp,
  12.     E.total,
  13.     SUM(E.total) suma
  14. FROM tbl_licencias TL INNER JOIN fun F ON TL.cod_fun = F.cod_fun
  15.     INNER JOIN licencias L ON F.cod_lic = L.cod_lic
  16.     INNER JOIN expensas E ON TL.cod_exp = E.cod_exp
  17.     fecha_lic BETWEEN '2012-01-01' AND '2012-05-23'
  18. GROUP BY dtalle_lic
__________________
¿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 24/05/2012, 13:26
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: GROUP BY & BETWEEN en una sola consulta

Hola nelson12345:

Complementando el comentario del compañero gnzsoloyo.

Si lo que quieres es contar cuantos registros de tu consulta 1 tienen una fecha contenida entre los rangos puedes hacerlo con una suma condicional, poniendo la condición BETWEEN dentro de la condición de la suma... veamos este ejemplo para ver si es más o menos lo que quieres.

Supongamos que le preguntamos a 10 personas si les gusta cierto artículo para determinar a qué grupo de personas dirigir la publicidad. Con sus respuestas obtenemos una tabla como esta:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+------+------+-----------+
  3. | id   | sexo | edad | respuesta |
  4. +------+------+------+-----------+
  5. |    1 | H    |   18 | si        |
  6. |    2 | M    |   21 | no        |
  7. |    3 | H    |   34 | si        |
  8. |    4 | H    |   42 | no        |
  9. |    5 | M    |   19 | no        |
  10. |    6 | H    |   36 | no        |
  11. |    7 | H    |   45 | si        |
  12. |    8 | M    |   21 | si        |
  13. |    9 | M    |   49 | si        |
  14. |   10 | H    |   50 | no        |
  15. +------+------+------+-----------+
  16. 10 rows in set (0.02 sec)

Supongamos que queremos agrupar por sexo y por respuesta los resultados: podríamos entonces hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT sexo, respuesta, COUNT(sexo) total
  2.     -> FROM tabla GROUP BY sexo, respuesta;
  3. +------+-----------+-------+
  4. | sexo | respuesta | total |
  5. +------+-----------+-------+
  6. | H    | no        |     3 |
  7. | H    | si        |     3 |
  8. | M    | no        |     2 |
  9. | M    | si        |     2 |
  10. +------+-----------+-------+
  11. 4 rows in set (0.00 sec)

Si observamos el resultado, obtenemos los mismos resultados para ambas categorías, por lo tanto la información no nos muestra algún patrón que podamos decidir, consideremos ahora la variable de edad. Si contamos las respuestas por RANGOS DE EDAD obtenemos lo siguiente:

Código MySQL:
Ver original
  1. mysql> SELECT sexo, respuesta, COUNT(*) total,
  2.     -> SUM(IF (edad BETWEEN 18 AND 30, 1, 0)) edad_18_a_30,
  3.     -> SUM(IF (edad BETWEEN 31 AND 50, 1, 0)) edad_31_a_50
  4.     -> FROM tabla GROUP BY sexo, respuesta;
  5. +------+-----------+-------+--------------+--------------+
  6. | sexo | respuesta | total | edad_18_a_30 | edad_31_a_50 |
  7. +------+-----------+-------+--------------+--------------+
  8. | H    | no        |     3 |            0 |            3 |
  9. | H    | si        |     3 |            1 |            2 |
  10. | M    | no        |     2 |            2 |            0 |
  11. | M    | si        |     2 |            1 |            1 |
  12. +------+-----------+-------+--------------+--------------+
  13. 4 rows in set (0.00 sec)

aquí observamos que por un lado a los hombres mayores de 30 años no les gusta el producto, pero en las mujeres sería lo contrario, es decir que a las mujeres menores de 30 es a las que no les gusta...

observa que la suma se hace de manera condicional poniendo dentro de la SUM la condición between:

Código:
SUM(IF (edad BETWEEN 31 AND 50, 1, 0)) edad_31_a_50
Dale un vistazo para ver si te sirve.

Saludos
Leo.

Etiquetas: group, registros, select, 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 15:59.