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

Totalizar cross table

Estas en el tema de Totalizar cross table en el foro de Mysql en Foros del Web. Hola, hice esta consulta para obtener una tabla de referencias cruzadas: Código: SELECT provincia, SUM(IF(id_caso = 1, 1, 0)) AS caso1, SUM(IF(id_caso = 2, 1, ...
  #1 (permalink)  
Antiguo 06/03/2007, 15:19
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Totalizar cross table

Hola, hice esta consulta para obtener una tabla de referencias cruzadas:

Código:
SELECT provincia,
SUM(IF(id_caso = 1, 1, 0)) AS caso1, 
SUM(IF(id_caso = 2, 1, 0)) AS caso2, 
SUM(IF(id_caso = 3, 1, 0)) AS caso3, 
SUM(IF(id_caso = 4, 1, 0)) AS caso4, 
COUNT(*) AS total_provincia
FROM provincias INNER JOIN ml_ordenanzas USING (id_provinc)
GROUP BY provincia
ORDER BY provincia ASC;
Esta SQL la ejecuta PHP y con sus datos dibujo una tabla html.
Me gustaría colocar como última fila de esa tabla los totales de cada columna (los totales de caso1, caso2, caso3, caso4 y total_provincia)

¿Cómo podría hacerlo?

Nota: Para llegar a este SQL lo hice en base a este excelente artículo pero no encuentro allí la forma de colocar un total general de "cada columna".

Gracias

EDIT: Por si no se entiende, la tabla es la siguiente y lo que pretendo lograr son los totales de la fila final (verde claro)


Última edición por AlZuwaga; 06/03/2007 a las 15:43
  #2 (permalink)  
Antiguo 07/03/2007, 11:54
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Re: Totalizar cross table

Hola, siguiendo la misma lógica del query anterior, coloqué esto:


Código:
SELECT 'Total',
SUM(IF(id_tema = 1, 1, 0)) AS caso1,
SUM(IF(id_tema = 2, 1, 0)) AS caso2, 
SUM(IF(id_tema = 3, 1, 0)) AS caso3, 
SUM(IF(id_tema = 4, 1, 0)) AS caso4, 
COUNT(*) AS total
FROM provincias INNER JOIN ml_ordenanzas USING (id_provinc)
Y me trae los resultados esperados para los totales. Pero... cuando hago un UNION de la consulta del post anterior y la de éste post, quedando así, ...

Código:
SELECT provincia,
SUM(IF(id_tema = 1, 1, 0)) AS caso1, 
SUM(IF(id_tema = 2, 1, 0)) AS caso2, 
SUM(IF(id_tema = 3, 1, 0)) AS caso3, 
SUM(IF(id_tema = 4, 1, 0)) AS caso4, 
COUNT(*) AS total
FROM provincias INNER JOIN ml_ordenanzas USING (id_provinc)
GROUP BY provincia

UNION
SELECT 'Total',
SUM(IF(id_tema = 1, 1, 0)) AS caso1,
SUM(IF(id_tema = 2, 1, 0)) AS caso2, 
SUM(IF(id_tema = 3, 1, 0)) AS caso3, 
SUM(IF(id_tema = 4, 1, 0)) AS caso4, 
COUNT(*) AS total
FROM provincias INNER JOIN ml_ordenanzas USING (id_provinc)

... me dice:

Cita:
MySQL ha dicho:
#1267 - Ilegal mezcla de collations (latin1_swedish_ci,IMPLICIT) y (utf8_general_ci,COERCIBLE) para operaci�n 'UNION'
¿qué ocurre?
__________________
...___...

Última edición por AlZuwaga; 07/03/2007 a las 12:01
  #3 (permalink)  
Antiguo 07/03/2007, 12:01
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Re: Totalizar cross table

Hummm... ¿es porque estoy metiendo un string (SELECT 'Total') que me lo interpreta como utf8_general_ci cuando el collation es latin1_swedish_ci?

Debe ser, porque si pongo:

Código:
SELECT provincia,
SUM(IF(id_tema = 1, 1, 0)) AS caso1, 
SUM(IF(id_tema = 2, 1, 0)) AS caso2, 
SUM(IF(id_tema = 3, 1, 0)) AS caso3, 
SUM(IF(id_tema = 4, 1, 0)) AS caso4, 
COUNT(*) AS total
FROM provincias INNER JOIN ml_ordenanzas USING (id_provinc)
GROUP BY provincia

UNION
SELECT MIN(Provincia),
SUM(IF(id_tema = 1, 1, 0)) AS caso1,
SUM(IF(id_tema = 2, 1, 0)) AS caso2, 
SUM(IF(id_tema = 3, 1, 0)) AS caso3, 
SUM(IF(id_tema = 4, 1, 0)) AS caso4, 
COUNT(*) AS total
FROM provincias INNER JOIN ml_ordenanzas USING (id_provinc)
Funciona. Pero me gustaría que diga la palabra Total, no que me ponga el valor mínimo del campo provincia.

Alguna sugerencia?
__________________
...___...
  #4 (permalink)  
Antiguo 07/03/2007, 13:14
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Re: Totalizar cross table

Listo

Código:
SELECT provincia,
SUM(IF(id_tema = 1, 1, 0)) AS caso1, 
SUM(IF(id_tema = 2, 1, 0)) AS caso2, 
SUM(IF(id_tema = 3, 1, 0)) AS caso3, 
SUM(IF(id_tema = 4, 1, 0)) AS caso4, 
COUNT(*) AS total
FROM provincias INNER JOIN ml_ordenanzas USING (id_provinc)
GROUP BY provincia
UNION
SELECT _latin1'Total',
SUM(IF(id_tema = 1, 1, 0)) AS caso1,
SUM(IF(id_tema = 2, 1, 0)) AS caso2, 
SUM(IF(id_tema = 3, 1, 0)) AS caso3, 
SUM(IF(id_tema = 4, 1, 0)) AS caso4, 
COUNT(*) AS total
FROM provincias INNER JOIN ml_ordenanzas USING (id_provinc)
El tema era justamente como lo terminé suponiendo. Al meter un literal, MySQL lo interpreta como utf8 (al menos en mi instalación... no se si en todas). Al especificarle el juego de caracteres a usar para el literal, se soluciona el problema.

Un agradecimiento muy especial para mi eterno amigo Webstudio (y mis felicitaciones por lo maravillosamente bien que está llevando su carrera ) por haberme pasado el enlace que solucionó mi problema.
__________________
...___...
  #5 (permalink)  
Antiguo 07/03/2007, 13:19
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Re: Totalizar cross table

Creo que es el mejor caso de un monólogo auto-resolutorio que vi en mi vida.
:D
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #6 (permalink)  
Antiguo 07/03/2007, 15:17
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Re: Totalizar cross table

Ajà...! me apunto a tu opiniòn webestudio
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #7 (permalink)  
Antiguo 07/03/2007, 15:25
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Re: Totalizar cross table

Es que, hombre, si me pongo a pensar en voz alta (como lo acabo de hacer aquí), la gente en la oficina pensaría que estoy mucho más loco de lo habitual!
__________________
...___...
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 02:14.