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

tabla dinamica, GROUP_CONCAT

Estas en el tema de tabla dinamica, GROUP_CONCAT en el foro de Mysql en Foros del Web. hola a todos consulta tengo una tabla con los siguientes campos id-rutalumno-fecha-asistencia quiero hacer una consulta como tabla dinámica excel pero no me sale si ...
  #1 (permalink)  
Antiguo 06/09/2017, 08:29
 
Fecha de Ingreso: octubre-2005
Mensajes: 114
Antigüedad: 12 años, 1 mes
Puntos: 0
tabla dinamica, GROUP_CONCAT

hola a todos consulta tengo una tabla con los siguientes campos

id-rutalumno-fecha-asistencia

quiero hacer una consulta como tabla dinámica excel pero no me sale

si hago un
Código:
select fecha from asistencia group by fecha
me nuestra las fecha que la tabla tiene , pero quiero los rutalumno que tengan asistencia en esa fecha.


se que lo puede hacer con GROUP_CONCAT no me sale, no se si existen mas variantes

gracias
__________________
Pablo Baez
  #2 (permalink)  
Antiguo 06/09/2017, 21:03
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.691
Antigüedad: 8 años, 2 meses
Puntos: 193
Respuesta: tabla dinamica, GROUP_CONCAT


Saludo
¿Y si se intenta con una subconsulta? Algo como:
Código MySQL:
Ver original
  1. SELECT fecha, rutalumno FROM asistencia
  2. WHERE EXISTS (SELECT fecha FROM asistencia GROUP BY fecha)
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 12/09/2017, 07:04
 
Fecha de Ingreso: octubre-2005
Mensajes: 114
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: tabla dinamica, GROUP_CONCAT

Hola encontré una forma estatica
Cita:
SELECT RutAlumno, MAX(IF(Fecha = '2017-09-05', Asistencia, NULL)) as '05-09-2017', MIN(IF(Fecha = '2017-09-04', Asistencia, NULL)) as '04-09-2017' FROM `Asistencia` GROUP BY RutAlumno
alguien sabe como lo hago en forma dinámica, ya que no me muestra nada

Cita:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('MAX(IF(Fecha = ''',Fecha,''', Asistencia, NULL)) AS ',Fecha)
) INTO @sql
FROM Asistencia;
SET @sql = CONCAT('SELECT RutAlumno, ', @sql, ' FROM Asistencia GROUP BY RutAlumno');
__________________
Pablo Baez
  #4 (permalink)  
Antiguo 12/09/2017, 12:02
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.691
Antigüedad: 8 años, 2 meses
Puntos: 193
Respuesta: tabla dinamica, GROUP_CONCAT

Cita:
Iniciado por pablobaez Ver Mensaje
Hola encontré una forma estatica


alguien sabe como lo hago en forma dinámica, ya que no me muestra nada
Saludo
Tal vez no muestra nada porque el if que se visualiza
no esta bien estructurado (Me refiero al segundo query).

Revisa eso.

Adicional, sería bueno que pusieras un ejemplo visual de lo que quieres,
o al menos escrito, explicando cuales tablas son las involucradas, campos,
datos de ejemplo y cual es el formato que esperas obtener.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #5 (permalink)  
Antiguo 13/09/2017, 10:37
 
Fecha de Ingreso: octubre-2005
Mensajes: 114
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: tabla dinamica, GROUP_CONCAT

ok explico la situación.
Tengo una tabla innobd que se llama asistencia en ella 4 campos(id, rutalumno, fecha, asistencia).
lo quiero hacer es un pivot dinámico con esa tabla pero no me sale. l resultado del estatico seria asi

RutAlumno 05-09-2017 04-09-2017
16089401-6 1 1
17490909-1 1 1
18355344-5 1 0
18498089-4 1 1
18541589-9 1 1
18925774-0 1 1
19056484-3 0 0


Eso me da como resultado cuando es estatico colocando las fecha manualmente de esta forma
Cita:
SELECT RutAlumno, MAX(IF(Fecha = '2017-09-05', Asistencia, NULL)) as '05-09-2017', MIN(IF(Fecha = '2017-09-04', Asistencia, NULL)) as '04-09-2017' FROM `Asistencia` GROUP BY RutAlumno
pero estoy buscado el dinámico y no comprendo cuando se refieren a que no esta bien estructurado con este query.
Cita:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(Fecha = '',
Fecha,
'', Asistencia, NULL)) AS ',
Fecha
)
) INTO @sql
FROM Asistencia;
SET @sql = CONCAT('SELECT RutAlumno, ', @sql, ' FROM Asistencia GROUP BY RutAlumno');
el resultado que me da es cero columnas
__________________
Pablo Baez
  #6 (permalink)  
Antiguo 13/09/2017, 16:20
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.691
Antigüedad: 8 años, 2 meses
Puntos: 193
Respuesta: tabla dinamica, GROUP_CONCAT

Vale, pues entiendo que la estructura inicial de la tabla es esta.

Código SQL:
Ver original
  1. +----+------------+------------+------------+
  2. | id | rutalumno  | fecha      | asistencia |
  3. +----+------------+------------+------------+
  4. |  1 | 16089401-6 | 2017-09-04 |          1 |
  5. |  2 | 16089401-6 | 2017-09-05 |          1 |
  6. |  3 | 17490909-1 | 2017-09-04 |          1 |
  7. |  4 | 17490909-1 | 2017-09-05 |          1 |
  8. |  5 | 18355344-5 | 2017-09-04 |          0 |
  9. |  6 | 18355344-5 | 2017-09-05 |          1 |
  10. |  7 | 18498089-4 | 2017-09-04 |          1 |
  11. |  8 | 18498089-4 | 2017-09-05 |          1 |
  12. |  9 | 18541589-9 | 2017-09-04 |          1 |
  13. | 10 | 18541589-9 | 2017-09-05 |          1 |
  14. | 11 | 18925774-0 | 2017-09-04 |          1 |
  15. | 12 | 18925774-0 | 2017-09-05 |          1 |
  16. | 13 | 19056484-3 | 2017-09-04 |          0 |
  17. | 14 | 19056484-3 | 2017-09-05 |          0 |
  18. +----+------------+------------+------------+

Luego, con el query manual, da esto

Código SQL:
Ver original
  1. +------------+------------+------------+
  2. | rutalumno  | 2017-09-05 | 2017-09-04 |
  3. +------------+------------+------------+
  4. | 16089401-6 |          1 |          1 |
  5. | 17490909-1 |          1 |          1 |
  6. | 18355344-5 |          1 |          0 |
  7. | 18498089-4 |          1 |          1 |
  8. | 18541589-9 |          1 |          1 |
  9. | 18925774-0 |          1 |          1 |
  10. | 19056484-3 |          0 |          0 |
  11. +------------+------------+------------+

Hasta aquí, ¿Voy bien, o hay algo distinto en los datos de la tabla?

Ya me dirás.

Ahora, revisemos esto

Código SQL:
Ver original
  1. SELECT @SQL;
  2. 'MAX(IF(Fecha = \',\nFecha,\n\', Asistencia, NULL)) AS 2017-09-04,MAX(IF(Fecha = \',\nFecha,\n\', Asistencia, NULL)) AS 2017-09-05'

Como puedes ver, la estructura que trae no es la deseada.

Lo más cercano podría ser algo así:

Código SQL:
Ver original
  1. CONCAT(
  2.         'MAX(IF(Fecha= Fecha,Asistencia, NULL)) ',
  3.         Fecha
  4.     )
  5. -- Obteniendo
  6. 'MAX(IF(Fecha = Fecha,Asistencia, NULL)) 2017-09-04,MAX(IF(Fecha = Fecha,Asistencia, NULL)) 2017-09-05'

Pero en cualquiera de los dos casos, se sigue teniendo un problema,
y es el alias que no encierra entre comillas.

Aunque habrá que ver si implementando esto en un sp o función
mejore el asunto.

En todo caso, se me ocurren dos soluciones más, y son:
1. Si todo se hace con un gestor de bd,
crear una función o un store procedure donde
se hagan ciclos para armar todos los días
que se quieran consultar (claramente tendría que recibir la fecha inicio
y la fecha fin, y luego que los ciclos tengan en cuenta estos datos)

2. Si este query esta asociado a una aplicación,
entonces que sea la aplicación con el lenguaje que
este manejando la encargada de crear el query dinámico,
y que una vez armado lo envie hacia la bd para ejecutarse

Espero que alguna idea sea de utilidad.


__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com



La zona horaria es GMT -6. Ahora son las 03:17.