Esto básicamente es una tabla dinámica.
Puede encontrar un buen tutorial sobre cómo lograr esto aquí:http:// www.artfulsoftware.com/infotree/qrytip.php?id=78
Aconsejo leer este post y adaptar esta solución a tus necesidades.
Actualizar
Después de que el enlace anterior ya no esté disponible, me siento obligado a proporcionar información adicional para todos los que buscan respuestas de mysql pivot aquí. Realmente tenía una gran cantidad de información, y no pondré todo desde allí aquí (más aún porque no quiero copiar su vasto conocimiento), pero daré algunos consejos sobre cómo lidiar con pivote. tablas de la manera sql generalmente con el ejemplo de peku que hizo la pregunta en primer lugar.
Tal vez el enlace vuelva pronto, estaré atento.
Al estilo de la hoja de cálculo...
Mucha gente simplemente usa una herramienta como MSExcel, OpenOffice u otras herramientas de hoja de cálculo para este propósito. Esta es una solución válida, simplemente copie los datos allí y use las herramientas que ofrece la GUI para resolver esto.
Pero... esa no era la pregunta, e incluso podría dar lugar a algunas desventajas, como cómo introducir los datos en la hoja de cálculo, escalado problemático, etc.
Al estilo SQL...
Dado que su tabla se parece a esto:
CREATE TABLE `test_pivot` (
`pid` bigint(20) NOT NULL AUTO_INCREMENT,
`company_name` varchar(32) DEFAULT NULL,
`action` varchar(16) DEFAULT NULL,
`pagecount` bigint(20) DEFAULT NULL,
PRIMARY KEY (`pid`)
) ENGINE=MyISAM;
Ahora mire en su tabla deseada:
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
Las filas (EMAIL
, PRINT x pages
) se parecen a las condiciones. La agrupación principal es por company_name
.
Para establecer las condiciones, esto pide a gritos usar el CASE
-declaración. Para agrupar por algo, bueno, usa... GROUP BY
.
El SQL básico que proporciona este pivote puede verse así:
SELECT P.`company_name`,
COUNT(
CASE
WHEN P.`action`='EMAIL'
THEN 1
ELSE NULL
END
) AS 'EMAIL',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '1'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 1 pages',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '2'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 2 pages',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '3'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 3 pages'
FROM test_pivot P
GROUP BY P.`company_name`;
Esto debería proporcionar el resultado deseado muy rápido. La principal desventaja de este enfoque es que cuantas más filas desee en su tabla dinámica, más condiciones necesitará definir en su instrucción SQL.
Esto también se puede tratar, por lo tanto, las personas tienden a usar declaraciones preparadas, rutinas, contadores y demás.
Algunos enlaces adicionales sobre este tema:
- http://anothermysqldba.blogspot. de/2013/06/tablas-dinámicas-ejemplo-en-mysql.html
- http://www.codeproject. com/Articles/363339/Cross-Tabulation-Pivot-Tables-with-MySQL
- http://datacharmer.org/downloads/pivot_tables_mysql_5.pdf
- https://codingsight.com/pivot-tables-in-mysql/