Wenn ich eine MySQL-Tabelle habe, die ungefähr so aussieht:
firmenname aktionsseitenanzahl ------------------------------- Firma A DRUCK 3 Firma A DRUCK 2 Firma A DRUCK 3 Firma B E-MAIL Firma B DRUCKEN 2 Firma B DRUCKEN 2 Firma B DRUCKEN 1 Firma A DRUCK 3
Ist es möglich, eine MySQL-Abfrage auszuführen, um eine Ausgabe wie folgt zu erhalten:
Firmenname E-MAIL DRUCKEN 1 Seiten DRUCKEN 2 Seiten DRUCKEN 3 Seiten -------------------------------------------------- ----------- FirmaA 0 0 1 3 FirmaB 1 1 2 0
Die Idee ist, dass pagecount
dies variieren kann, sodass die Anzahl der Ausgabespalten dies widerspiegeln sollte, eine Spalte für jedes action
/ pagecount
Paar und dann die Anzahl der Treffer pro company_name
. Ich bin nicht sicher, ob dies eine Pivot-Tabelle genannt wird, aber jemand hat das vorgeschlagen?
Antworten:
Diese im Grunde ist eine Pivot - Tabelle.
Ein nettes Tutorial dazu finden Sie hier: http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Ich empfehle, diesen Beitrag zu lesen und diese Lösung an Ihre Bedürfnisse anzupassen.
Aktualisieren
Nachdem der obige Link derzeit nicht mehr verfügbar ist, fühle ich mich verpflichtet, einige zusätzliche Informationen für alle bereitzustellen, die hier nach MySQL-Pivot-Antworten suchen. Es gab wirklich eine Menge Informationen, und ich werde hier nicht alles von hier einfügen (noch mehr, da ich ihr umfangreiches Wissen einfach nicht kopieren möchte), aber ich werde einige Ratschläge geben, wie man mit Pivot umgeht Tabellen die SQL-Art im Allgemeinen mit dem Beispiel von Peku, der die Frage an erster Stelle gestellt hat.
Vielleicht kommt der Link bald zurück, ich werde ein Auge darauf haben.
Die Tabellenkalkulation ...
Viele Leute verwenden zu diesem Zweck nur ein Tool wie MSExcel, OpenOffice oder andere Tabellenkalkulations-Tools. Dies ist eine gültige Lösung. Kopieren Sie einfach die Daten dort und verwenden Sie die von der GUI angebotenen Tools, um dies zu lösen.
Aber ... das war nicht die Frage, und es könnte sogar zu einigen Nachteilen führen, wie zum Beispiel, wie die Daten in die Tabelle aufgenommen werden, problematische Skalierung und so weiter.
Der SQL-Weg ...
Angesichts dessen sieht sein Tisch ungefähr so aus:
Schauen Sie nun in den gewünschten Tisch:
Die Zeilen (
EMAIL
,PRINT x pages
) ähneln den Bedingungen. Die Hauptgruppierung ist voncompany_name
.Um die Bedingungen einzurichten, ruft dies eher nach der Verwendung der
CASE
Anweisung. Um zu einer Gruppe von etwas, na ja, Gebrauch ...GROUP BY
.Das grundlegende SQL, das diesen Pivot bereitstellt, kann ungefähr so aussehen:
Dies sollte sehr schnell das gewünschte Ergebnis liefern. Je größer der Nachteil dieses Ansatzes ist, desto mehr Zeilen müssen in Ihrer Pivot-Tabelle enthalten sein, desto mehr Bedingungen müssen Sie in Ihrer SQL-Anweisung definieren.
Dies kann auch behandelt werden, daher neigen die Leute dazu, vorbereitete Anweisungen, Routinen, Zähler und dergleichen zu verwenden.
Einige zusätzliche Links zu diesem Thema:
quelle
Meine Lösung ist in T-SQL ohne Drehpunkte:
quelle
SUM()
nur mit numerischen Daten gearbeitet werden kann, wenn Sie Zeichenfolgen schwenken müssen, die Sie verwenden müssenMAX()
SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END)
, können Sie einfach tun ,SUM(action='PRINT' AND pagecount=1)
da der Zustand konvertiert werden wird ,1
wenn wahr und0
wenn falschFür MySQL können Sie Bedingungen direkt in
SUM()
Funktion setzen und es wird als Boolescher Wert ausgewertet0
oder1
Sie können Ihre Anzahl basierend auf Ihren Kriterien ohne Verwendung vonIF/CASE
Anweisungen festlegenDEMO
quelle
crosstab()
Funktion.Verwenden Sie für dynamischen Pivot
GROUP_CONCAT
mitCONCAT
. Die Funktion GROUP_CONCAT verkettet Zeichenfolgen aus einer Gruppe mit verschiedenen Optionen zu einer Zeichenfolge.DEMO HIER
quelle
Eine Stardard-SQL- Version mit boolescher Logik :
SQL Fiddle.
Wie?
TRUE OR NULL
ergibtTRUE
.FALSE OR NULL
ergibtNULL
.NULL OR NULL
ergibtNULL
.Und
COUNT
zählt nur Nicht-Null-Werte. Voilá.quelle
Die richtige Antwort lautet:
quelle
other_value
Tabelle aufgebaut?SET
Abfrage zur Erhöhung des auf 1024 für GROUP_CONCAT auf 1024 begrenzten Defualt-Werts fehlt. GROUP_CONCAT schneidet die Zeichenfolge einfach ohne Fehler ab, was bedeutet, dass unerwartete Ergebnisse auftreten können.Es gibt ein Tool namens MySQL Pivot Table Generator, mit dem Sie webbasierte Pivot-Tabellen erstellen können, die Sie später in Excel exportieren können (wenn Sie möchten). Dies kann funktionieren, wenn sich Ihre Daten in einer einzelnen Tabelle oder in mehreren Tabellen befinden.
Sie müssen lediglich die Datenquelle der Spalten (sie unterstützt dynamische Spalten), Zeilen, die Werte im Hauptteil der Tabelle und die Tabellenbeziehung (falls vorhanden) angeben.
Die Homepage dieses Tools lautet http://mysqlpivottable.net
quelle
quelle