SQL - Group by a string

 
Vista:

Group by a string

Publicado por Xavier (13 intervenciones) el 21/07/2016 12:18:59
Hola

Tengo un problema de rendimiento al intentar realizar una actualización masiva de datos.

Necesito hacer una agrupación por el número de cuenta

SELECT ledgerAccount
FROM GeneralJournalAccountEntry
WHERE mainAccount = 0
GROUP BY ledgerAccount

el problema es que el campo ledgerAccount es un string que puede tener los siguientes valores

Ejemplo registros en la tabla:

11112-100-20
11112-100-20
11112-50-10
11112-50-10
1110-20
1110-15-abc
P006

El resultado de esa consulta es

11112-100-20
11112-50-10
1110-20
1110-15-abc
P006

pero lo que realmente necesito que me devuelva es la cuenta principal los campos restantes son las dimensiones de la cuenta.

Esto es lo que necesito:

11112
1110
P006

porque luego realizo un bucle con los registros devueltos para actualizar el valor de un campo.

Es posible hacerlo? estoy hablando que en la tabla del group by existen mas de 50millones re registros y el proceso demora horas tal como está.
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: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Group by a string

Publicado por leonardo_josue (1173 intervenciones) el 21/07/2016 16:22:37
Hola Xavier:

Suponiendo que tu cadena siempre tenga el caracter '-' como separador y que sólo te interese la primer parte (es decir, hasta que encuentres el primer separador), puedes utilizar la función de cadena SUBSTRING_INDEX(str,delim,count) para extraerla

http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index

es decir, hacer algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
SELECT
   substring_index(campo, '-', 1) cuenta, count(*) total
FROM tabla
GROUP BY 1;
 
|-------+--------|
|cuenta | total  |
|-------+--------|
|11112  | 4      |
|1110   | 2      |
|P006   | 1      |
|-------+--------|

Ahora bien, para el rendimiento de la consulta, no depende solamente de número de registros en tu tabla, sino también en el correcto uso de índices. Revisa el plan de ejecución de tu consulta para ver qué mejoras se puede hacer a tu tabla.

http://dev.mysql.com/doc/refman/5.7/en/explain.html

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

Group by a string

Publicado por xavier (13 intervenciones) el 21/07/2016 16:25:21
El problema es que existen registros con guion y sin.

Puede existir

1515 - 100- 10

y

1010

donde 1515 y 1010 son el número de cuenta
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: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Group by a string

Publicado por leonardo_josue (1173 intervenciones) el 21/07/2016 17:10:57
Hola de nuevo:

Antes que otra cosa, olvidé mencionar que esta respuesta es válida sólo para MySQL... si estás utilizando un motor de BD's distinto, entonces hay que buscar otra alternativa.

Ahora bien, si en realidad estás utilizando MySQL no hay ningún problema si no existe el separador '-' en la cadena, de hecho, con los datos de pusiste de ejemplo, el último registro no tiene guión, en ese caso, la función SUBSTRING_INDEX te regresa la cadena completa...

Vuelvo a insistir, la consulta funciona para MySQL, si no estás utilizando este, dinos con qué estás trabajando y te podemos ayudar con otro método alternativo.

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