Comment renvoyer la sortie d'un tableau croisé dynamique dans MySQL ?
P粉578343994
P粉578343994 2023-07-25 13:59:22
0
2
454
<p>Si j'ai une table MySQL comme celle-ci : </p> 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é> <p>Pouvez-vous exécuter une requête MySQL pour obtenir le résultat suivant : </p> <pre>nom_entreprise EMAIL IMPRIMER 1 pages IMPRIMER 2 pages IMPRIMER 3 pages -------------------------------------------------- ---------- SociétéA 0 0 1 3 EntrepriseB 1 1 2 0 ≪/pré> <p>L'idée est que le nombre de pages peut varier. Le nombre de colonnes dans le résultat doit donc refléter cela, avec une colonne pour chaque nombre d'actions/pages, puis compter le nombre de clics pour chaque nom d'entreprise. Je ne sais pas si cela s'appelle un tableau croisé dynamique, mais quelqu'un a suggéré de le faire. </p>
P粉578343994
P粉578343994

répondre à tous(2)
P粉461599845

Ma solution consiste à utiliser T-SQL au lieu de n'importe quel tableau croisé dynamique :

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粉574268989

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 de l'adapter à vos propres besoins.

MISE À JOUR

Étant donné que le lien ci-dessus n'est actuellement plus disponible, j'ai ressenti le besoin de fournir ici des informations supplémentaires à tous ceux qui recherchent des réponses aux tableaux croisés dynamiques MySQL. Ce lien contient vraiment beaucoup d'informations, je ne vais pas tout copier (et je ne veux pas copier leur richesse de connaissances), mais je vais donner quelques conseils sur la façon de travailler avec des tableaux croisés dynamiques en SQL, avec peku Prenons la question posée comme exemple.

Peut-être que le lien sera bientôt rétabli, je garderai un œil dessus.

La méthode des feuilles de calcul...

Beaucoup de gens utilisent simplement des outils comme MSExcel, OpenOffice ou d'autres outils de feuilles de calcul pour accomplir cette tâche. 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 certains inconvénients, comme la façon d'importer des données dans des feuilles de calcul, des problèmes d'évolutivité, etc.

Façon SQL...

Supposons 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 le tableau des attentes :

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

La ligne (EMAIL, imprimer x pages) est comme une condition. Le regroupement principal se fait par nom d'entreprise.

Afin de définir des conditions, il est plus approprié d'utiliser l'instruction CASE. Pour regrouper par quelque chose, vous pouvez utiliser GROUP BY.

Une instruction 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 souhaitez avoir de lignes dans le tableau croisé dynamique, plus vous devez définir de conditions dans l'instruction SQL.

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

Voici 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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!