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

Concat + group by + mysql

Estas en el tema de Concat + group by + mysql en el foro de Mysql en Foros del Web. Tengo una consulta de la siguiente manera Código: SELECT institucion_codificacion,institucion_nombre, SUM(IF(proyecta_tiempo='N',proyecta_importe,NULL)) as suma FROM proyecciones p Left join institucion i ON i.institucion_id=p.proyecta_ruta group by proyecta_ruta ...
  #1 (permalink)  
Antiguo 27/08/2010, 02:18
Avatar de Fabu_dina  
Fecha de Ingreso: enero-2004
Mensajes: 425
Antigüedad: 20 años, 9 meses
Puntos: 1
Pregunta Concat + group by + mysql

Tengo una consulta de la siguiente manera

Código:
SELECT institucion_codificacion,institucion_nombre, SUM(IF(proyecta_tiempo='N',proyecta_importe,NULL)) as suma
FROM proyecciones p
Left join institucion i ON i.institucion_id=p.proyecta_ruta
group by proyecta_ruta

podria poner un concat parecido al sum pero quiero que una los contenidos de un campo texto y forme una cadena de texto
  #2 (permalink)  
Antiguo 27/08/2010, 02:31
Avatar de Fabu_dina  
Fecha de Ingreso: enero-2004
Mensajes: 425
Antigüedad: 20 años, 9 meses
Puntos: 1
Respuesta: Concat + group by + mysql

creo haberlo solucionado con lo siguiente si alguien conoce otra manerea de hacerlo seria de mucha ayuda pero de todos modos lo apunto por si alguien tienen el mismo problema

Usando la funcion "group_concat"

Código:
SELECT institucion_codificacion,institucion_nombre, SUM(IF(proyecta_tiempo='N',proyecta_importe,NULL)) as suma_no,
SUM(IF(proyecta_tiempo='S',proyecta_importe,NULL)) as suma_si,
group_concat(proyecta_quincena)
FROM proyecciones p
Left join institucion i ON i.institucion_id=p.proyecta_ruta
group by proyecta_ruta
  #3 (permalink)  
Antiguo 27/08/2010, 02:31
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, 11 meses
Puntos: 2658
Respuesta: Concat + group by + mysql

Algunos detalles:
No uses NULL en una operación de aritmética o de encadenamiento. Es el elemento nulo y toda operación con él produce NULL.
CONCAT() opera sobre el mismo registro. Puedes también usar CONCAT_WS():
Cita:
CONCAT_WS(separator,str1,str2,...)

CONCAT_WS() significa CONCAT With Separator (CONCAT con separador) y es una forma especial de CONCAT(). El primer argumento es el separador para el resto de argumentos. El separador se añade entre las cadenas a concatenar. El separador puede ser una cadena como el resto de argumentos. Si el separador es NULL, el resultado es NULL. La función evita valores NULL tras el argumento separador.

Código MySQL:
Ver original
  1. mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');
  2.         -> 'First name,Second name,Last Name'
  3. mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
  4.         -> 'First name,Last Name'
En MySQL 5.0, CONCAT_WS() no evita cadenas vacías. (Sin embargo, evita NULLs.)
Si los campos a combinar pertenecen al mismo registro, debes usar CONCAT, si pertenecen a diferentes registros, lo que corresponde es GROUP_CONCAT, pero este te los combinará separados por comas a menos que le indiques otra cosa:
12.10.1. Funciones (de agregación) de GROUP BY
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 27/08/2010, 02:34
Avatar de Fabu_dina  
Fecha de Ingreso: enero-2004
Mensajes: 425
Antigüedad: 20 años, 9 meses
Puntos: 1
Respuesta: Concat + group by + mysql

muchas gracias por tu ayuda.

pero como funcionaria para hacer que solo concatene los que cumplen cierta condicion de igual manera que el sum


Ref al NULL en el sum no habra valor NULL cuando cumplan las condiciones siempre existira un valor de todos modos tengo problemas?
  #5 (permalink)  
Antiguo 27/08/2010, 02:42
Avatar de Fabu_dina  
Fecha de Ingreso: enero-2004
Mensajes: 425
Antigüedad: 20 años, 9 meses
Puntos: 1
Respuesta: Concat + group by + mysql

a ver que opinas de esto


Código:
SELECT institucion_codificacion,institucion_nombre, SUM(IF(proyecta_tiempo='N',proyecta_importe,NULL)) as suma_no,
SUM(IF(proyecta_tiempo='S',proyecta_importe,NULL)) as suma_si,
group_concat(IF(proyecta_tiempo='N',proyecta_quincena,NULL)) as concate_si,
group_concat(IF(proyecta_tiempo='S',proyecta_quincena,NULL)) as concate_no
FROM proyecciones p
Left join institucion i ON i.institucion_id=p.proyecta_ruta
group by proyecta_ruta
  #6 (permalink)  
Antiguo 27/08/2010, 02:44
Avatar de Fabu_dina  
Fecha de Ingreso: enero-2004
Mensajes: 425
Antigüedad: 20 años, 9 meses
Puntos: 1
Respuesta: Concat + group by + mysql

Código MySQL:
Ver original
  1. SELECT institucion_codificacion,institucion_nombre, SUM(IF(proyecta_tiempo='N',proyecta_importe,NULL)) as suma_no,
  2. SUM(IF(proyecta_tiempo='S',proyecta_importe,NULL)) as suma_si,
  3. group_concat(IF(proyecta_tiempo='N',proyecta_quincena,NULL)) as concate_si,
  4. group_concat(IF(proyecta_tiempo='S',proyecta_quincena,NULL)) as concate_no
  5. FROM proyecciones p
  6. Left join institucion i ON i.institucion_id=p.proyecta_ruta
  7. group by proyecta_ruta
  #7 (permalink)  
Antiguo 27/08/2010, 02:57
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, 11 meses
Puntos: 2658
Respuesta: Concat + group by + mysql

Cita:
pero como funcionaria para hacer que solo concatene los que cumplen cierta condicion de igual manera que el sum
Si no vas a usar otros registros que los que vas a concatenar, lo que te conviene es hacer:
Código MySQL:
Ver original
  1.    institucion_codificacion,
  2.    institucion_nombre,    
  3.    SUM(proyecta_importe) suma
  4. WHERE proyecta_tiempo='N';
  5. GROUP BY proyecta_ruta;

Básicamente hace lo mismo, pero lo hace sobre un conjunto acotado

Si quieres que aparezcan todos, incluso los que no cumplen esa condición, lo que haces es más o menos correcto, pero esto:
Código MySQL:
Ver original
  1.    institucion_codificacion,
  2.    institucion_nombre,    
  3.    SUM(proyecta_importe) suma
  4.    (SELECT
  5.       institucion_codificacion,
  6.       institucion_nombre,
  7.       proyecta_ruta,    
  8.       IF(proyecta_tiempo='N', proyecta_importe, 0) proyecta_importe
  9.    FROM proyecciones p LEFT JOIN institucion i
  10.       ON i.institucion_id=p.proyecta_ruta) t1
  11. GROUP BY proyecta_ruta;
Lo hace más claro y sencillo de entender, e incluso más seguro y tal vez rápido.

No hay que tener miedo de escribir consultas algo complejas, porque muchas veces la solución más eficiente llega por allí. Solamente trata de escribirlas estructuradamente, como para que se las pueda leer más fácil (si no se las escribe estructuradamente, cuando empiezas con consultas de 150 líneas encontrar un error es una tarea imposible).

Cita:
Ref al NULL en el sum no habra valor NULL cuando cumplan las condiciones siempre existira un valor de todos modos tengo problemas?
NULL no es un valor, sino una condición, un estado, por lo que realizar manipulaciones con él puede dar lugar a problemas. No lo trates como valor.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 27/08/2010, 03:05
Avatar de Fabu_dina  
Fecha de Ingreso: enero-2004
Mensajes: 425
Antigüedad: 20 años, 9 meses
Puntos: 1
Respuesta: Concat + group by + mysql

con esa consulta no me muestra la suma de valores bajo las condiciones del campo proyecta_tiempo y tampoco me concatena los valores de los campos proyecta_quincena en cambio con la que tengo si lo hace existe alguna manera de mejorarla, te comento que estoy haciendo mis primeros pasos en mysql



Código MySQL:
Ver original
  1. SELECT institucion_codificacion,institucion_nombre, SUM(IF(proyecta_tiempo='N',proyecta_importe,NULL)) as suma_no,
  2. SUM(IF(proyecta_tiempo='S',proyecta_importe,NULL)) as suma_si,
  3. group_concat(IF(proyecta_tiempo='N',proyecta_quincena,NULL)) as concate_si,
  4. group_concat(IF(proyecta_tiempo='S',proyecta_quincena,NULL)) as concate_no
  5. FROM proyecciones p
  6. Left join institucion i ON i.institucion_id=p.proyecta_ruta
  7. group by proyecta_ruta

Etiquetas: group
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 00:57.