Esto es básicamente una tabla dinámica.
Un buen tutorial sobre cómo lograr esto se puede encontrar aquí: http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Aconsejo leer esta publicación y adaptar esta solución a sus necesidades.
Actualizar
Después de que el enlace anterior ya no esté disponible, me siento obligado a proporcionar información adicional para todos ustedes que buscan respuestas de mysql pivot aquí. Realmente tenía una gran cantidad de información, y no pondré todo desde allí (incluso más, ya que no quiero copiar su vasto conocimiento), pero daré algunos consejos sobre cómo lidiar con pivot 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.
La forma de la hoja de cálculo ...
Muchas personas simplemente usan una herramienta como MSExcel, OpenOffice u otras herramientas de hoja de cálculo para este propósito. Esta es una solución válida, solo copie los datos allí y use las herramientas que ofrece la GUI para resolver esto.
Pero ... esta no era la pregunta, e incluso podría dar lugar a algunas desventajas, como cómo ingresar los datos en la hoja de cálculo, la escala problemática, etc.
La forma SQL ...
Dada su mesa se ve algo así:
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 mesa 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 configurar las condiciones, esto grita más bien por usar la CASE
declaración. Con el fin de agrupar por algo, así, el uso ... 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. El principal inconveniente de este enfoque, cuantas más filas desee en su tabla dinámica, más condiciones deberá definir en su declaración SQL.
Esto también puede tratarse, por lo tanto, las personas tienden a usar declaraciones preparadas, rutinas, contadores y demás.
Algunos enlaces adicionales sobre este tema: