Comment générer la sortie d'un tableau croisé dynamique dans MySQL ?
P粉180844619
P粉180844619 2023-08-22 10:54:31
0
2
465
Si j'ai une table MySQL comme celle-ci : Nombre de pages de l'action <pre>company_name ---------------------------------- ENTREPRISE A IMPRIMER 3 ENTREPRISE A IMPRIMER 2 ENTREPRISE A IMPRIMER 3 Société BEMAIL Société B PRINT 2 Société B PRINT 2 SOCIÉTÉ B IMPRIMER 1 ENTREPRISE A IMPRIMER 3 ≪/pré> Est-il possible d'exécuter une requête MySQL pour obtenir un résultat comme celui-ci : <pre>nom_entreprise EMAIL IMPRIMER 1 page IMPRIMER 2 pages IMPRIMER 3 pages -------------------------------------------------- ---------- SociétéA 0 0 1 3 EntrepriseB 1 1 2 0 ≪/pré> L'idée est que <code>pagecount</code> peut changer, donc le nombre de colonnes dans la sortie doit refléter cela, une colonne pour chaque <code>action</code>/<code>pagecount</code>. ; , puis comptez le nombre d'accès pour chaque <code>company_name</code>. Je ne sais pas si cela s'appelle un tableau croisé dynamique, mais quelqu'un a suggéré ceci
P粉180844619
P粉180844619

répondre à tous(2)
P粉696891871

Ma solution est d'utiliser T-SQL sans aucun pivot :

SELECT
    CompanyName,  
    SUM(CASE WHEN (action='EMAIL') THEN 1 ELSE 0 END) AS Email,
    SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END) AS Print1Pages,
    SUM(CASE WHEN (action='PRINT' AND pagecount=2) THEN 1 ELSE 0 END) AS Print2Pages,
    SUM(CASE WHEN (action='PRINT' AND pagecount=3) THEN 1 ELSE 0 END) AS Print3Pages
FROM 
    Company
GROUP BY 
    CompanyName
P粉608647033

Il s’agit essentiellement d’un tableau croisé dynamique.

Un tutoriel détaillé sur la façon de mettre en œuvre cela peut être trouvé ici : http://www.artfulsoftware.com/infotree/qrytip.php?id=78

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

Mise à jour

Étant donné que le lien ci-dessus n'est actuellement plus disponible, je me sens obligé de fournir ici des informations supplémentaires à tous ceux qui recherchent des réponses aux tableaux croisés dynamiques MySQL. Il contient une tonne d'informations, et je ne copierai pas tout ici (sans parler du fait que je ne veux pas copier leurs vastes connaissances), mais je donnerai quelques conseils sur la façon de travailler avec des tableaux croisés dynamiques à l'aide de SQL, et d'abord Exemple de peku qui a posé la question.

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

Méthode tableur...

Beaucoup de gens utilisent simplement des tableurs comme MSExcel, OpenOffice ou autres à cette fin. C'est une solution valable, copiez simplement les données là-bas et utilisez les outils fournis par l'interface graphique pour résoudre le problème.

Mais... ce n'est pas le nœud du problème, et peut même entraîner certaines lacunes, comme la manière d'importer des données dans des feuilles de calcul, des problèmes d'évolutivité, etc.

Façon SQL...

Supposons que sa montre 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;

Jetez maintenant un œil au tableau de ce qu'il attend :

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

ligne (EMAILPRINT x pages)表示条件。主要的分组是按company_nameréalisée.

Afin de définir des conditions, il est plus approprié d'utiliser l'instruction CASECASE语句。为了按某个东西进行分组,使用...GROUP BY. Pour regrouper par quelque chose, utilisez...GROUP BY.

Le SQL de base pour fournir ce tableau croisé dynamique pourrait 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 les résultats souhaités très rapidement. Le principal inconvénient de cette approche est que plus vous avez besoin de lignes dans le tableau croisé dynamique, plus vous devez définir de conditions dans l'instruction SQL.

Cela peut également être résolu, c'est pourquoi les gens ont tendance à utiliser des instructions préparées, des routines, des compteurs, etc.

Quelques liens supplémentaires sur ce sujet :

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal