J'ai essayé de rechercher des articles, mais je n'ai trouvé que des solutions pour SQL Server / Access. J'ai besoin d'une solution dans MySQL (5.X).
J'ai une table (appelée historique) avec 3 colonnes: hostid, itemname, itemvalue.
Si je fais un select ( select * from history
), il reviendra
+--------+----------+-----------+
| hostid | itemname | itemvalue |
+--------+----------+-----------+
| 1 | A | 10 |
+--------+----------+-----------+
| 1 | B | 3 |
+--------+----------+-----------+
| 2 | A | 9 |
+--------+----------+-----------+
| 2 | c | 40 |
+--------+----------+-----------+
Comment interroger la base de données pour renvoyer quelque chose comme
+--------+------+-----+-----+
| hostid | A | B | C |
+--------+------+-----+-----+
| 1 | 10 | 3 | 0 |
+--------+------+-----+-----+
| 2 | 9 | 0 | 40 |
+--------+------+-----+-----+
Réponses:
Je vais ajouter une explication un peu plus longue et plus détaillée des étapes à suivre pour résoudre ce problème. Je m'excuse si c'est trop long.
Je vais commencer par la base que vous avez donnée et l'utiliser pour définir quelques termes que j'utiliserai pour le reste de cet article. Ce sera la table de base :
Ce sera notre objectif, le joli tableau croisé dynamique :
Les valeurs de la
history.hostid
colonne deviendront des valeurs y dans le tableau croisé dynamique. Les valeurs de lahistory.itemname
colonne deviendront des valeurs x (pour des raisons évidentes).Lorsque je dois résoudre le problème de la création d'un tableau croisé dynamique, je l'aborde en utilisant un processus en trois étapes (avec une quatrième étape facultative):
Appliquons ces étapes à votre problème et voyons ce que nous obtenons:
Étape 1: sélectionnez les colonnes d'intérêt . Dans le résultat souhaité,
hostid
fournit les valeurs y etitemname
fournit les valeurs de x .Étape 2: prolongez la table de base avec des colonnes supplémentaires . Nous avons généralement besoin d'une colonne par valeur x. Rappelez-vous que notre colonne de valeur x est
itemname
:Notez que nous n'avons pas changé le nombre de lignes - nous avons simplement ajouté des colonnes supplémentaires. Notez également le modèle de
NULL
s - une ligne avecitemname = "A"
a une valeur non nulle pour la nouvelle colonneA
et des valeurs nulles pour les autres nouvelles colonnes.Étape 3: regroupez et agrégez la table étendue . Nous devons
group by hostid
, car il fournit les valeurs y:(Notez que nous avons maintenant une ligne par valeur y.) D'accord, nous y sommes presque! Nous devons juste nous débarrasser de ces horribles
NULL
s.Étape 4: joliment . Nous allons simplement remplacer toutes les valeurs nulles par des zéros afin que le jeu de résultats soit plus agréable à regarder:
Et nous avons terminé - nous avons construit un joli tableau croisé dynamique en utilisant MySQL.
Considérations lors de l'application de cette procédure:
itemvalue
dans cet exempleNULL
, mais cela pourrait aussi être0
ou""
, selon votre situation exactesum
, maiscount
etmax
sont aussi souvent utilisés (max
est souvent utilisé lors de la création d '"objets" à une ligne qui avaient été répartis sur plusieurs lignes)group by
clause (et ne les oubliezselect
pas)Limitations connues:
la source
la source
group by
.MAX
place deSUM
parce que mesitemValue
chaînes sont des chaînes, pas des valeurs numériques.Une autre option, particulièrement utile si vous avez de nombreux éléments à faire pivoter, est de laisser mysql construire la requête pour vous:
FIDDLE a ajouté quelques valeurs supplémentaires pour le voir fonctionner
GROUP_CONCAT
a une valeur par défaut de 1000 donc si vous avez une très grosse requête, modifiez ce paramètre avant de l'exécuterTester:
la source
'ifnull(SUM(case when itemname = ''',
avec''' then itemvalue end),0) AS
«,»'SUM(case when itemname = '''
avec''' then itemvalue else 0 end) AS ',
. Cela génère des termes commeSUM(case when itemname = 'A' then itemvalue else 0 end) AS 'A'
.Profitant de l'idée de Matt Fenwick qui m'a aidé à résoudre le problème (merci beaucoup), réduisons-le à une seule requête:
la source
Je modifier Agung Sagita de » réponse de sous - requête à se joindre. Je ne suis pas sûr de la différence entre ces deux méthodes, mais juste pour une autre référence.
la source
utiliser une sous-requête
mais ce sera un problème si la sous-requête résultant plus d'une ligne, utilisez une fonction d'agrégation supplémentaire dans la sous-requête
la source
Ma solution:
Il produit les résultats attendus dans le cas soumis.
la source
Je fais cela en
Group By hostId
alors il affichera seulement la première ligne avec des valeurs,comme:
la source
Je trouve un moyen de rendre mes rapports convertissant des lignes en colonnes presque dynamiques à l'aide de requêtes simples. Vous pouvez le voir et le tester en ligne ici .
Le nombre de colonnes de requête est fixe mais les valeurs sont dynamiques et basées sur des valeurs de lignes. Vous pouvez le créer.J'utilise donc une requête pour créer l'en-tête de la table et une autre pour voir les valeurs:
Vous pouvez également le résumer:
Résultats de RexTester :
http://rextester.com/ZSWKS28923
Pour un vrai exemple d'utilisation, ce reportage ci-dessous affiche en colonnes les heures de départs arrivées de bateau / bus avec un horaire visuel. Vous verrez une colonne supplémentaire non utilisée au dernier col sans confondre la visualisation: ** système de billetterie pour vendre des billets en ligne et présentiel
la source
Si vous pouviez utiliser MariaDB, il existe une solution très très simple.
Depuis MariaDB-10.02 , un nouveau moteur de stockage appelé CONNECT a été ajouté qui peut nous aider à convertir les résultats d'une autre requête ou table en un tableau croisé dynamique, comme vous le souhaitez: vous pouvez consulter la documentation .
Tout d'abord, installez le moteur de stockage connect .
Maintenant, la colonne pivot de notre tableau est
itemname
et les données de chaque élément sont situées dans laitemvalue
colonne, nous pouvons donc avoir le tableau croisé dynamique des résultats en utilisant cette requête:Maintenant, nous pouvons sélectionner ce que nous voulons dans
pivot_table
:Plus de détails ici
la source
Ce n'est pas la réponse exacte que vous recherchez, mais c'était une solution dont j'avais besoin pour mon projet et j'espère que cela aidera quelqu'un. Cela listera 1 à n éléments de ligne séparés par des virgules. Group_Concat rend cela possible dans MySQL.
Ce cimetière a deux noms communs, donc les noms sont répertoriés dans différentes lignes reliées par un seul identifiant mais deux identifiants de nom et la requête produit quelque chose comme ce
CemeteryID Cemetery_Name Latitude
1 Appleton, Sulpher Springs 35.4276242832293
la source
Je suis désolé de le dire et peut-être que je ne résous pas votre problème exactement, mais PostgreSQL a 10 ans de plus que MySQL et est extrêmement avancé par rapport à MySQL et il existe de nombreuses façons d'y parvenir facilement. Installez PostgreSQL et exécutez cette requête
alors voila! Et voici une documentation complète: PostgreSQL: Documentation: 9.1: tablefunc ou cette requête
puis encore voila! PostgreSQL: Documentation: 9.0: hstore
la source