Ich habe versucht, Beiträge zu suchen, aber ich habe nur Lösungen für SQL Server / Access gefunden. Ich brauche eine Lösung in MySQL (5.X).
Ich habe eine Tabelle (genannt Verlauf) mit 3 Spalten: Host-ID, Elementname, Elementwert.
Wenn ich select ( select * from history
) mache , wird es zurückgegeben
+--------+----------+-----------+
| hostid | itemname | itemvalue |
+--------+----------+-----------+
| 1 | A | 10 |
+--------+----------+-----------+
| 1 | B | 3 |
+--------+----------+-----------+
| 2 | A | 9 |
+--------+----------+-----------+
| 2 | c | 40 |
+--------+----------+-----------+
Wie frage ich die Datenbank ab, um so etwas zurückzugeben?
+--------+------+-----+-----+
| hostid | A | B | C |
+--------+------+-----+-----+
| 1 | 10 | 3 | 0 |
+--------+------+-----+-----+
| 2 | 9 | 0 | 40 |
+--------+------+-----+-----+
Antworten:
Ich werde eine etwas längere und detailliertere Erläuterung der Schritte zur Lösung dieses Problems hinzufügen. Ich entschuldige mich, wenn es zu lang ist.
Ich beginne mit der Basis, die Sie angegeben haben, und definiere damit einige Begriffe, die ich für den Rest dieses Beitrags verwenden werde. Dies wird die Basistabelle sein :
Dies wird unser Ziel sein, der hübsche Pivot-Tisch :
Die Werte in der
history.hostid
Spalte werden zu y-Werten in der Pivot-Tabelle. Die Werte in derhistory.itemname
Spalte werden (aus offensichtlichen Gründen) zu x-Werten .Wenn ich das Problem der Erstellung einer Pivot-Tabelle lösen muss, gehe ich es in drei Schritten an (mit einem optionalen vierten Schritt):
Lassen Sie uns diese Schritte auf Ihr Problem anwenden und sehen, was wir bekommen:
Schritt 1: Wählen Sie die gewünschten Spalten aus . Liefert im gewünschten Ergebnis
hostid
die y-Werte unditemname
liefert die x-Werte .Schritt 2: Erweitern Sie die Basistabelle um zusätzliche Spalten . Wir benötigen normalerweise eine Spalte pro x-Wert. Denken Sie daran, dass unsere x-Wert-Spalte lautet
itemname
:Beachten Sie, dass wir die Anzahl der Zeilen nicht geändert haben - wir haben nur zusätzliche Spalten hinzugefügt. Beachten Sie auch das Muster von
NULL
s - eine Zeile mititemname = "A"
hat einen Wert ungleich Null für eine neue SpalteA
und Nullwerte für die anderen neuen Spalten.Schritt 3: Gruppieren und aggregieren Sie die erweiterte Tabelle . Wir müssen
group by hostid
, da es die y-Werte liefert:(Beachten Sie, dass wir jetzt eine Zeile pro y-Wert haben.) Okay, wir sind fast da! Wir müssen nur diese hässlichen
NULL
s loswerden .Schritt 4: verschönern . Wir werden nur alle Nullwerte durch Nullen ersetzen, damit die Ergebnismenge besser aussieht:
Und wir sind fertig - wir haben mit MySQL eine schöne, hübsche Pivot-Tabelle erstellt.
Überlegungen bei der Anwendung dieses Verfahrens:
itemvalue
in diesem Beispiel verwendetNULL
, aber es könnte auch sein,0
oder""
, abhängig von Ihrer genauen Situationsum
, abercount
und werdemax
auch oft verwendet (max
wird oft verwendet, wenn einzeilige "Objekte" erstellt werden, die über viele Zeilen verteilt waren)group by
Klausel ein (und vergessen Sieselect
sie nicht).Bekannte Einschränkungen:
quelle
quelle
group by
.MAX
stattdessen verwenden,SUM
weil meineitemValue
Zeichenfolgen sind, keine numerischen Werte.Eine weitere Option, die besonders nützlich ist, wenn Sie viele Elemente zum Schwenken benötigen, besteht darin, MySQL die Abfrage für Sie erstellen zu lassen:
FIDDLE Es wurden einige zusätzliche Werte hinzugefügt, damit es funktioniert
GROUP_CONCAT
hat einen Standardwert von 1000. Wenn Sie also eine wirklich große Abfrage haben, ändern Sie diesen Parameter, bevor Sie ihn ausführenPrüfung:
quelle
Lassen Sie uns die Idee von Matt Fenwick nutzen, die mir bei der Lösung des Problems geholfen hat (vielen Dank), und reduzieren Sie sie auf nur eine Abfrage:
quelle
Ich bearbeite Agung Sagitas Antwort von der Unterabfrage, um beizutreten. Ich bin mir nicht sicher, wie viel Unterschied zwischen diesen beiden Möglichkeiten besteht, aber nur als weitere Referenz.
quelle
Unterabfrage verwenden
Es ist jedoch ein Problem, wenn eine Unterabfrage, die mehr als eine Zeile ergibt, eine weitere Aggregatfunktion in der Unterabfrage verwendet
quelle
Meine Lösung :
Es liefert die erwarteten Ergebnisse im eingereichten Fall.
quelle
Ich mache das
Group By hostId
dann zeigt es nur die erste Zeile mit Wertenwie:
quelle
Ich finde eine Möglichkeit, meine Berichte mithilfe einfacher Abfragen fast dynamisch in Zeilen umzuwandeln. Sie können es hier online sehen und testen .
Die Anzahl der Abfragespalten ist festgelegt, aber die Werte sind dynamisch und basieren auf Zeilenwerten. Sie können es erstellen Also verwende ich eine Abfrage, um den Tabellenkopf zu erstellen, und eine andere, um die Werte anzuzeigen:
Sie können es auch zusammenfassen:
Ergebnisse von RexTester :
http://rextester.com/ZSWKS28923
Für ein reales Anwendungsbeispiel zeigt dieser Bericht in Spalten die Ankunftszeiten von Booten / Bussen mit einem visuellen Zeitplan. Sie werden eine zusätzliche Spalte sehen, die in der letzten Spalte nicht verwendet wird, ohne die Visualisierung zu verwirren: ** Ticketingsystem, um Tickets online und präsentativ zu verkaufen
quelle
Wenn Sie MariaDB verwenden könnten, gibt es eine sehr sehr einfache Lösung.
Seit MariaDB-10.02 wurde eine neue Speicher-Engine namens CONNECT hinzugefügt , mit deren Hilfe wir die Ergebnisse einer anderen Abfrage oder Tabelle in eine Pivot-Tabelle konvertieren können, genau wie Sie es möchten: Sie können sich die Dokumente ansehen .
Zunächst einmal installieren Sie die connect - Speicher - Engine .
Jetzt ist die Pivot-Spalte unserer Tabelle
itemname
und die Daten für jedes Element befinden sich in deritemvalue
Spalte, sodass wir die Ergebnis-Pivot-Tabelle mithilfe dieser Abfrage haben können:Jetzt können wir auswählen, was wir wollen aus
pivot_table
:Weitere Details hier
quelle
Dies ist nicht die genaue Antwort, die Sie suchen, aber es war eine Lösung, die ich für mein Projekt brauchte und hoffe, dass dies jemandem hilft. Dadurch werden 1 bis n durch Kommas getrennte Zeilenelemente aufgelistet. Group_Concat macht dies in MySQL möglich.
Dieser Friedhof hat zwei gebräuchliche Namen, daher werden die Namen in verschiedenen Zeilen aufgelistet, die durch eine einzelne ID, aber zwei Namens-IDs verbunden sind, und die Abfrage erzeugt so etwas wie diese
CemeteryID Cemetery_Name Latitude
1 Appleton, Sulpher Springs 35.4276242832293
quelle
Es tut mir leid, das zu sagen, und vielleicht löse ich Ihr Problem nicht genau, aber PostgreSQL ist 10 Jahre älter als MySQL und im Vergleich zu MySQL extrem fortgeschritten. Es gibt viele Möglichkeiten, dies einfach zu erreichen. Installieren Sie PostgreSQL und führen Sie diese Abfrage aus
dann voila! Und hier ist eine umfangreiche Dokumentation: PostgreSQL: Dokumentation: 9.1: tablefunc oder diese Abfrage
dann wieder voila! PostgreSQL: Dokumentation: 9.0: hstore
quelle