Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So erstellen Sie dynamische Pivot-Tabellen in MySQL

Pivot-Tabellen erleichtern die Analyse großer Datenmengen, indem Informationen in einem kleineren, überschaubaren Datensatz organisiert werden. Es gibt jedoch keine eingebaute Funktion, um Pivot in MySQL zu erreichen. Wir müssen eine SQL-Abfrage schreiben, um Zeilen in Spalten in MySQL umzuwandeln, und dann einen Pivot-Bericht in MySQL erstellen. Schauen wir uns also an, wie man dynamische Pivot-Tabellen in MySQL erstellt.

So erstellen Sie dynamische Pivot-Tabellen in MySQL

Wenn Sie in MySQL eine Pivot-Tabelle erstellen möchten, verwenden Sie normalerweise IF/CASE-Anweisungen. Dieser Ansatz funktioniert jedoch nur, wenn Sie bereits alle Spalten kennen, die Sie in einer Pivot-Tabelle erstellen müssen.

Wie erstellen Sie dynamische Pivot-Tabellen in MySQL, wenn Sie die zu erstellenden Spalten nicht kennen oder erwarten, dass sie sich im Laufe der Zeit ändern? In solchen Fällen verwenden wir die GROUP_CONCAT Funktion.

Angenommen, Sie haben die folgende Tabelle

CREATE TABLE Meeting
(
    ID INT,
    Meeting_id INT,
    field_key VARCHAR(100),
    field_value VARCHAR(100)
);

INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (1, 1,'first_name' , 'Alec');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (2, 1,'last_name' , 'Jones');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (3, 1,'occupation' , 'engineer');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (4,2,'first_name' , 'John');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (5,2,'last_name' , 'Doe');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (6,2,'occupation' , 'engineer');

+------+------------+------------+-------------+
| ID   | Meeting_id | field_key  | field_value |
+------+------------+------------+-------------+
|    1 |          1 | first_name | Alec        |
|    2 |          1 | last_name  | Jones       |
|    3 |          1 | occupation | engineer    |
|    4 |          2 | first_name | John        |
|    5 |          2 | last_name  | Doe         |
|    6 |          2 | occupation | engineer    |
+------+------------+------------+-------------+

Angenommen, Sie möchten eine dynamische Pivot-Tabelle erstellen, sodass für jeden eindeutigen Wert in field_key eine neue Spalte erstellt wird Spalte, also (Vorname, Nachname, Beruf)

+------------+-------------+-------------+-------------+
| Meeting_id | first_name  |  last_name  |  occupation |
+------------+-------------+-------------+-------------+
|          1 |       Alec  | Jones       | engineer    |
|          2 |       John  | Doe         | engineer    |
+------------+-------------+-------------+-------------+

Erstellen Sie dynamische Pivot-Tabellen in MySQL

Wenn Sie bereits wissen, welche Spalten in einer Pivot-Tabelle erstellt werden sollen, können Sie eine CASE-Anweisung verwenden, um eine Pivot-Tabelle zu erstellen. Um jedoch dynamische Pivot-Tabellen in MySQL zu erstellen, verwenden wir GROUP_CONCAT Funktion zum dynamischen Transponieren von Zeilen in Spalten, wie unten gezeigt.

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when field_key = ''',
      field_key,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql 
FROM
  Meeting;
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting 
                   GROUP BY Meeting_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Mit GROUP_CONCAT können Sie Werte aus mehreren Zeilen zu einer einzigen Zeichenfolge verketten. In der obigen Abfrage verwenden wir GROUP_CONCAT, um dynamisch CASE-Anweisungen basierend auf eindeutigen Werten im field_key zu erstellen -Spalte und speichern Sie diese Zeichenfolge in der @sql-Variablen. Es wird dann verwendet, um unsere Auswahlabfrage zu erstellen.

+------------+------------+-----------+------------+
| Meeting_id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Auf diese Weise können Sie Pivot-Tabellenabfragen in MySQL automatisieren.

Sie können die obige Abfrage an Ihre Anforderungen anpassen, indem Sie eine WHERE-Klausel oder JOINS hinzufügen.

Wenn Sie nur ausgewählte Zeilenwerte als Spalten pivotieren möchten, können Sie Ihrer ersten select GROUP_CONCAT-Anweisung eine WHERE-Klausel hinzufügen, wie fett dargestellt unten

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when field_key = ''',
      field_key,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql
FROM
  Meeting
WHERE <condition>;

Wenn Sie Zeilen in Ihrer endgültigen Pivot-Tabelle filtern möchten, können Sie die WHERE-Klausel in Ihre SET-Anweisung einfügen, wie in fett dargestellt unten.

SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting WHERE <condition>
                   GROUP BY Meeting_id');

Ebenso können Sie JOINS in Ihrer SQL-Abfrage anwenden, während Sie dynamische Pivot-Tabellen in MySQL erstellen.

Sobald Sie dynamische Pivot-Tabellen in MySQL erstellt haben, können Sie sie mit einem Berichterstellungstool in einer Tabelle darstellen. Hier ist ein Beispiel für eine Pivot-Tabelle, die mit Ubiq erstellt wurde.

Wussten Sie, dass Sie dynamische Pivot-Tabellen in Ubiq erstellen können, ohne SQL schreiben zu müssen?

Übrigens, wenn Sie Pivot-Tabellen, Diagramme und Dashboards aus einer MySQL-Datenbank erstellen möchten, können Sie Ubiq ausprobieren. Wir bieten eine 14-tägige kostenlose Testversion an.