Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je renvoyer la sortie d'un tableau croisé dynamique dans MySQL ?

C'est essentiellement est un tableau croisé dynamique.

Un bon tutoriel sur la façon d'y parvenir peut être trouvé ici :http:// www.artfulsoftware.com/infotree/qrytip.php?id=78

Je vous conseille de lire cet article et d'adapter cette solution à vos besoins.

Mettre à jour

Une fois que le lien ci-dessus n'est plus disponible actuellement, je me sens obligé de fournir des informations supplémentaires à tous ceux qui recherchent des réponses au pivot mysql ici. Il contenait vraiment une grande quantité d'informations, et je ne mettrai pas tout à partir de là (d'autant plus que je ne veux tout simplement pas copier leurs vastes connaissances), mais je donnerai quelques conseils sur la façon de gérer pivot tableaux de la manière sql généralement avec l'exemple de peku qui a posé la question en premier lieu.

Peut-être que le lien reviendra bientôt, je garderai un œil dessus.

La méthode du tableur...

Beaucoup de gens utilisent simplement un outil comme MSExcel, OpenOffice ou d'autres tableurs à cette fin. C'est une solution valable, il suffit de copier les données là-bas et d'utiliser les outils proposés par l'interface graphique pour résoudre ce problème.

Mais... ce n'était pas la question, et cela pourrait même entraîner certains inconvénients, comme la manière d'intégrer les données dans la feuille de calcul, une mise à l'échelle problématique, etc.

La méthode SQL...

Étant donné que sa table ressemble à ceci :

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;

Regardez maintenant dans sa table souhaitée :

company_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
-------------------------------------------------------------
CompanyA        0       0               1               3
CompanyB        1       1               2               0

Les lignes (EMAIL , PRINT x pages ) ressemblent à des conditions. Le regroupement principal est par company_name .

Afin de mettre en place les conditions cela crie plutôt pour utiliser le CASE -déclaration. Pour regrouper par quelque chose, eh bien, utilisez ... GROUP BY .

Le SQL de base fournissant ce pivot peut ressembler à ceci :

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`;

Cela devrait fournir le résultat souhaité très rapidement. L'inconvénient majeur de cette approche, plus vous voulez de lignes dans votre tableau croisé dynamique, plus vous devez définir de conditions dans votre instruction SQL.

Cela peut aussi être traité, donc les gens ont tendance à utiliser des instructions préparées, des routines, des compteurs et autres.

Quelques liens supplémentaires sur ce sujet :