Basicamente, essa é uma tabela dinâmica.
Um bom tutorial sobre como conseguir isso pode ser encontrado aqui: http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Aconselho a leitura deste post e adapto esta solução às suas necessidades.
Atualizar
Depois que o link acima não está mais disponível no momento, sinto-me obrigado a fornecer algumas informações adicionais para todos vocês que procuram por respostas dinâmicas do mysql aqui. Ele realmente tinha uma grande quantidade de informações e não colocarei tudo aqui (ainda mais porque não quero copiar seu vasto conhecimento), mas darei alguns conselhos sobre como lidar com o pivô tabelas da maneira sql geralmente com o exemplo de peku que fez a pergunta em primeiro lugar.
Talvez o link volte em breve, eu vou ficar de olho nele.
A maneira da planilha ...
Muitas pessoas usam apenas uma ferramenta como MSExcel, OpenOffice ou outras ferramentas de planilha para esse fim. Esta é uma solução válida, basta copiar os dados e usar as ferramentas que a GUI oferece para resolver isso.
Mas ... essa não era a questão, e pode até levar a algumas desvantagens, como como inserir os dados na planilha, dimensionamento problemático e assim por diante.
O jeito SQL ...
Dada a tabela dele, é algo como isto:
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;
Agora olhe para a tabela desejada:
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
As linhas ( EMAIL
, PRINT x pages
) se assemelham às condições. O agrupamento principal é por company_name
.
Para configurar as condições, isso significa que você usa a CASE
instrução-. A fim de grupo por alguma coisa, bem, uso ... GROUP BY
.
O SQL básico que fornece esse pivô pode se parecer com isso:
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`;
Isso deve fornecer o resultado desejado muito rapidamente. A principal desvantagem dessa abordagem, quanto mais linhas você deseja na sua tabela dinâmica, mais condições você precisa definir na sua instrução SQL.
Isso também pode ser resolvido, portanto, as pessoas tendem a usar declarações, rotinas, contadores preparados e outros.
Alguns links adicionais sobre este tópico: