Comment renvoyer la sortie du tableau croisé dynamique dans MySQL ?
P粉926174288
P粉926174288 2023-08-23 20:25:28
0
2
373
<p>Si j'ai une table MySQL qui ressemble à ceci : </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>Est-il possible d'exécuter une requête MySQL pour obtenir un résultat comme celui-ci : </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 <code>pagecount</code> peut varier, donc le nombre de colonnes de sortie doit refléter cela, pour chaque <code>action</code>/<code>pagecount</code> Pour une colonne, indiquez le nombre de clics pour chaque <code>company_name</code>. Je ne sais pas si cela s'appelle un tableau croisé dynamique, mais est-ce que quelqu'un l'a suggéré ? </p>
P粉926174288
P粉926174288

répondre à tous(2)
P粉368878176

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

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

Un bon tutoriel 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

Après que le lien ci-dessus n'est actuellement plus disponible, j'ai ressenti le besoin de fournir des informations supplémentaires à tous ceux qui recherchent ici des réponses au hub MySQL. Il contient une tonne d'informations, je ne les mettrai pas toutes ici (ni même plus, car je ne veux tout simplement pas reproduire leurs vastes connaissances), mais je donnerai quelques conseils sur la façon de gérer les pivots en général. dans le tableau des méthodes SQL, en prenant comme exemple le peku qui a posé la question en premier.

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

Méthode tableur...

De nombreuses personnes utilisent simplement MSExcel, OpenOffice ou d'autres outils de feuille de calcul à 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 un problème, cela peut même entraîner certains inconvénients comme la façon d'introduire les données dans la feuille de calcul, des problèmes de mise à l'échelle, etc.

Façon SQL...

Étant donné que son formulaire 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;

Voir le formulaire qu'il souhaite maintenant :

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

OK (电子邮件打印 x 页)类似于条件。主要分组是按company_name.

Pour définir des conditions, vous devez utiliser la déclaration CASE. Pour regrouper par quelque chose, utilisez...GROUP BYGROUP BY.

Le SQL de base pour fournir ce pivot 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 de lignes dans le tableau croisé dynamique, plus vous devez définir de conditions dans l'instruction SQL.

Cela peut également être géré, de sorte que les gens ont tendance à utiliser des déclarations préparées, des routines, des compteurs, etc.

Quelques autres liens 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!