Si j'ai une table MySQL ressemblant à ceci:
nom_entreprise action pagecount ------------------------------- Société A PRINT 3 Société A PRINT 2 Société A PRINT 3 Société B EMAIL Société B PRINT 2 Société B PRINT 2 Société B PRINT 1 Société A PRINT 3
Est-il possible d'exécuter une requête MySQL pour obtenir une sortie comme celle-ci:
nom_entreprise EMAIL IMPRIMER 1 pages IMPRIMER 2 pages IMPRIMER 3 pages -------------------------------------------------- ----------- EntrepriseA 0 0 1 3 SociétéB 1 1 2 0
L'idée est que pagecount
peut varier de sorte que le montant de la colonne de sortie doit refléter le fait que, une colonne pour chaque action
/ pagecount
paire et nombre de visites par company_name
. Je ne sais pas si cela s'appelle un tableau croisé dynamique, mais quelqu'un a suggéré cela?
Réponses:
Il s'agit essentiellement d' un tableau croisé dynamique.
Un joli didacticiel 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
Après que le lien ci-dessus ne soit plus disponible actuellement, je me sens obligé de fournir des informations supplémentaires pour vous tous à la recherche de réponses de pivot mysql ici. Il avait vraiment une grande quantité d'informations, et je ne mettrai pas tout à partir d'ici (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 le pivot tables 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 manière tableur ...
De nombreuses personnes utilisent simplement un outil comme MSExcel, OpenOffice ou d'autres outils de tableur à cet effet. C'est une solution valide, copiez simplement les données là-bas et utilisez 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 des inconvénients, comme la façon de placer les données dans la feuille de calcul, une mise à l'échelle problématique, etc.
La manière SQL ...
Étant donné que sa table ressemble à ceci:
Maintenant, regardez dans sa table désirée:
Les lignes (
EMAIL
,PRINT x pages
) ressemblent à des conditions. Le regroupement principal est parcompany_name
.Afin de mettre en place les conditions cela crie plutôt pour l'utilisation de la
CASE
déclaration. Pour groupe par quelque chose, eh bien, l' utilisation ...GROUP BY
.Le SQL de base fournissant ce pivot peut ressembler à ceci:
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 également être traité, par conséquent, les gens ont tendance à utiliser des instructions, des routines, des compteurs et autres.
Quelques liens supplémentaires sur ce sujet:
la source
Ma solution est en T-SQL sans aucun pivot:
la source
SUM()
cela ne peut fonctionner avec des données numériques que si vous avez besoin de pivoter des chaînes que vous devrez utiliserMAX()
SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END)
, vous pouvez simplement le faireSUM(action='PRINT' AND pagecount=1)
car la condition sera convertie en1
vraie et0
en faussePour MySQL, vous pouvez directement mettre des conditions en
SUM()
fonction et elles seront évaluées comme booléennes0
ou1
et ainsi vous pouvez avoir votre compte en fonction de vos critères sans utiliser d'IF/CASE
instructionsDEMO
la source
crosstab()
.Pour un pivot dynamique, utilisez
GROUP_CONCAT
avecCONCAT
. La fonction GROUP_CONCAT concatène les chaînes d'un groupe en une chaîne avec différentes options.DÉMO ICI
la source
Une version stardard-SQL utilisant la logique booléenne :
SQL Fiddle.
Comment?
TRUE OR NULL
rendementsTRUE
.FALSE OR NULL
rendementsNULL
.NULL OR NULL
rendementsNULL
.Et
COUNT
ne compte que les valeurs non nulles. Voilá.la source
La bonne réponse est:
la source
other_value
table?SET
requête pour augmenter la valeur par défaut qui est limitée à 1024 pour GROUP_CONCAT après 1024 GROUP_CONCAT tronque simplement la chaîne sans erreur, ce qui signifie que des résultats inattendus peuvent se produire ...Il existe un outil appelé générateur de tableaux croisés dynamiques MySQL, il peut vous aider à créer un tableau croisé dynamique basé sur le Web que vous pourrez ensuite exporter vers Excel (si vous le souhaitez). cela peut fonctionner si vos données sont dans une seule table ou dans plusieurs tables.
Tout ce que vous devez faire est de spécifier la source de données des colonnes (il prend en charge les colonnes dynamiques), les lignes, les valeurs dans le corps de la table et la relation de table (le cas échéant)
La page d'accueil de cet outil est http://mysqlpivottable.net
la source
la source