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

Agrupar segun una REGXP

Estas en el tema de Agrupar segun una REGXP en el foro de Mysql en Foros del Web. Amigos tengo una duda, tengo una tabla con una cantidad de clientes y pretendo saber el numero de clientes por su numero de identificacion (cuantos ...
  #1 (permalink)  
Antiguo 13/05/2013, 14:39
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Agrupar segun una REGXP

Amigos tengo una duda, tengo una tabla con una cantidad de clientes y pretendo saber el numero de clientes por su numero de identificacion (cuantos hay de 1 millon, 2 millones ...)

Construi una RegExp para ello pero debo de especificar la cantidad que busco:

SELECT count(*) as cantidad FROM kepen.clientes WHERE cod_cli regexp '^(v)(-)(1)([0-9]{6})$'
order by cod_cli

si pongo esto:

SELECT count(*) as cantidad FROM kepen.clientes WHERE cod_cli regexp '^(v)(-)([0-9])([0-9]{6})$'
order by cod_cli

me va a traer todo, y pues quiero que me los agrupe algo como:

cantidad 1 millon = xxx
cantidad 2 millones = xxx

Claro es saber si se puede hacer...
  #2 (permalink)  
Antiguo 13/05/2013, 14:51
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: Agrupar segun una REGXP

¿El campo "COD_CLI" es numérico o de caracteres?
__________________
¿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 13/05/2013, 14:58
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Agrupar segun una REGXP

Hola JuJoGuAl:

gnzsoloyo se me adelantó con la pregunta... ¿qué almacenas en tu campo? porque si estás almacenando cantidades numéricas, podrías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +----------+
  3. | cantidad |
  4. +----------+
  5. |  1234567 |
  6. |  2345678 |
  7. |  3456789 |
  8. |  1357911 |
  9. |  2468100 |
  10. +----------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT
  14.     -> CONCAT("cantidad de ", cantidad DIV 1000000, " millones"), COUNT(*)
  15.     -> FROM tabla
  16.     -> GROUP BY 1;
  17. +-----------------------------------------------------------+----------+
  18. | CONCAT("cantidad de ", cantidad DIV 1000000, " millones") | COUNT(*) |
  19. +-----------------------------------------------------------+----------+
  20. | cantidad de 1 millones                                    |        2 |
  21. | cantidad de 2 millones                                    |        2 |
  22. | cantidad de 3 millones                                    |        1 |
  23. +-----------------------------------------------------------+----------+
  24. 3 rows in set (0.00 sec)

Saludos
Leo.
  #4 (permalink)  
Antiguo 13/05/2013, 14:58
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: Agrupar segun una REGXP



Precisamente apuntaba a eso....

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 13/05/2013, 15:00
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Agrupar segun una REGXP

jajajaja te adelantaste con la pregunta, me adelanté con la respuesta

Saludos
Leo.
  #6 (permalink)  
Antiguo 13/05/2013, 15:06
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Agrupar segun una REGXP

No no es Numerico (no en su totalidad) como es un identificador de persona hay campos V-XXX o E-XXX
  #7 (permalink)  
Antiguo 13/05/2013, 15:14
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Agrupar segun una REGXP

postea algunos datos de ejemplo, no pongas V-XXX... si con la expresión regular estás extrayendo sólo los registros que sí son numéricos, lo que puedes hacer es extraer solo la parte con la cantidad que te interesa, convertir esta cadena a número y seguir con la lógica de utilizar DIV

saludos
Leo.
  #8 (permalink)  
Antiguo 13/05/2013, 15:31
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Agrupar segun una REGXP

Código MySQL:
Ver original
  1. mysql> select * from clientes order by rand() limit 10 \g
  2. +--------+------------+-------------+--------------------+------------+----------------+--------+--------+
  3. | serial | idtienda   | cod_cli     | nom_cli            | fec_ini    | dir_cli        | ciudad | estado |
  4. +--------+------------+-------------+--------------------+------------+----------------+--------+--------+
  5. |  26910 | J297360484 | V-11314359  | LEO RAMIREZ        | 2011-03-01 | CHACAO         | 02     | 17     |
  6. |  51097 | J297360484 | V-17299706  | MARIANA LOVERA     | 2011-08-30 | CHACO          | 02     | 17     |
  7. |  38481 | J297360484 | V12711577   | MARIA GABRIELA     | 2011-05-12 | LA FLORIDA     | 02     | 17     |
  8. |  63683 | J297360484 | V-6902451   | CAROLIN A QUINTERO | 2012-01-14 | SAN BERNARDINO | 02     | 17     |
  9. |  59657 | J297360484 | E-82069791. | ALEJANDRA          | 2011-12-05 | CCS            | 02     | 17     |
  10. |  87586 | J297360484 | V-987990    | MARIO              | 2012-12-14 | CCS            | 02     | 17     |
  11. |  61121 | J297360484 | V-15713105  | GERALDINE OCHOA    | 2011-12-20 | CCS            | 02     | 17     |
  12. |  86005 | J297360484 | V-16898869  | OLIVER HERNANDEZ   | 2012-11-20 | CCS            | 02     | 17     |
  13. |  69051 | J297360484 | V-10814054  | MONICA MILLAN }}}  | 2012-03-21 | CCS            | 02     | 17     |
  14. |  71593 | J297360484 | V-12476593  | SUSAN USECHE       | 2012-04-27 | SAN IGNACIO    | 02     | 17     |
  15. +--------+------------+-------------+--------------------+------------+----------------+--------+--------+
  16. 10 rows in set (0.29 sec)

alli hay un E- ... y V- ...

INcluso hay datos que no cumplen ese formato (por error del usuario no los agrego correctamente)

Última edición por JuJoGuAl; 13/05/2013 a las 15:47
  #9 (permalink)  
Antiguo 13/05/2013, 15:53
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Agrupar segun una REGXP

Tal como te comenté, en primer lugar, puedes utilizar la expresión regular para encontrar las cadenas que siguen el formato que mencionas, de una v, un guión (-) y un número... a partir de esto, puedes extraer sólo la parte numérica y convertirla a número. Checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT cod_cli, CAST(SUBSTRING(cod_cli, 3) AS UNSIGNED) cod_cli_numero
  2.     -> FROM clientes WHERE cod_cli REGEXP '^(v)(-)[0-9]*$';
  3. +------------+----------------+
  4. | cod_cli    | cod_cli_numero |
  5. +------------+----------------+
  6. | V-11314359 |       11314359 |
  7. | V-17299706 |       17299706 |
  8. | V-6902451  |        6902451 |
  9. | V-987990   |         987990 |
  10. | V-15713105 |       15713105 |
  11. | V-16898869 |       16898869 |
  12. | V-10814054 |       10814054 |
  13. | V-12476593 |       12476593 |
  14. +------------+----------------+
  15. 8 rows in set (0.00 sec)

Observa que la segunda columna contiene el valor de tu cadena que necesitas para agrupar... con este dato puedes seguir la lógica que te indiqué en mi primer post... observa que modifiqué un poco la REGEXP para considerar todas las longitudes de tus códigos, pero si la que tú pusiste es correcta, bueno, utilizas la tuya. haz y el intento y si tienes problemas lo comentas en el foro.

Saludos
Leo.
  #10 (permalink)  
Antiguo 13/05/2013, 16:10
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Agrupar segun una REGXP

Es bastante cercano a lo que busco pero no me sirve mucho... me salen cantidades de 99 millones, 100 millones cosa que no es factible y creo porque hay casos donde no colocan V-.. si no que hacen EJEML: V98551 (en otros casos ni colocan la V o E)
  #11 (permalink)  
Antiguo 13/05/2013, 17:00
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: Agrupar segun una REGXP

En esas condiciones sería muy buena idea tratar de normalizar los datos antes de proseguir, y controlar en la aplicación que no entren datos basura (se denomina así, por ejemplo, a los datos no estandarizados), porque de lo contrario será muy difícil crear una consulta eficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 14/05/2013, 09:13
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Agrupar segun una REGXP

Como puedo extraer solo el texto de esa cadena? porque con la funcion que me paso leonardo extrae es apartir del 3er caracter y deje solo lo Numerico?
  #13 (permalink)  
Antiguo 14/05/2013, 09:38
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: Agrupar segun una REGXP

Bueno, hace tiempo puse en las FAQs de MySQL una función que descartaba los caracteres y dejaba lo numérico.
http://www.forosdelweb.com/f86/faqs-...1/#post3093671

Para hacer al revés se usa la misma lógica, aunque se tiene que considerar el charset y collation, para evitar problemas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 14/05/2013, 11:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Agrupar segun una REGXP

consejo: normalizar como te han dicho.
consulta poco eficiente, pero que debería funcionar (entiendo que 987100 sería 1 millón; y 1000001, sería 2 millones). Quito mediante replace anidados el guión, la V y la E. Luego hago el casting a la división del número por 1000000, pero usando CEILING para que me devuelva el entero superior. El texto > 0 es para evitar donde hubiera cadena con solo caracteres alfabéticos.
Código MySQL:
Ver original
  1.  COUNT(*) totales,
  2.  CEILING(CAST( REPLACE( REPLACE( REPLACE( campotexto, '-', '' ) , 'V', '' ) , 'E', '' ) AS UNSIGNED )/1000000)
  3. FROM `tabla`
  4.  WHERE campotexto > 0
  5. GROUP BY CEILING(CAST( REPLACE( REPLACE( REPLACE( campotexto, '-', '' ) , 'V', '' ) , 'E', '' ) AS UNSIGNED )/1000000)

Etiquetas: agrupar, select, tabla
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 08:25.