Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso retornar a saída da tabela dinâmica no MySQL?


Isso basicamente é 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 ler este post e adaptar esta solução às suas necessidades.

Atualizar

Depois que o link acima não estiver mais disponível, sinto-me obrigado a fornecer algumas informações adicionais para todos vocês que procuram respostas do mysql pivot aqui. Realmente tinha uma grande quantidade de informações, e não vou colocar tudo de lá (ainda mais porque não quero copiar o vasto conhecimento deles), mas vou dar algumas dicas de como lidar com pivô tabelas da maneira sql geralmente com o exemplo de peku que fez a pergunta em primeiro lugar.

Talvez o link volte em breve, vou ficar de olho.

O jeito 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 para lá 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 colocar os dados na planilha, dimensionamento problemático e assim por diante.

A maneira SQL...

Dada a sua tabela parece algo assim:
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 a condições. O agrupamento principal é por company_name .

Para configurar as condições, isso significa usar o CASE -demonstração. Para agrupar por algo, bem, use ... GROUP BY .

O SQL básico que fornece esse pivô pode ser algo assim:
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 rápido. A principal desvantagem dessa abordagem, quanto mais linhas você deseja em sua tabela dinâmica, mais condições você precisa definir em sua instrução SQL.

Isso também pode ser tratado, pois as pessoas tendem a usar declarações preparadas, rotinas, contadores e afins.

Alguns links adicionais sobre este tópico: