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

So transponieren Sie Zeilen dynamisch in Spalten in MySQL

Manchmal werden Ihre Daten möglicherweise in Zeilen gespeichert und Sie möchten sie möglicherweise als Spalten melden. In solchen Fällen müssen Sie Zeilen in Spalten transponieren. Manchmal können sogar diese Zeilen variabel sein. So wissen Sie vielleicht, wie viele Spalten Sie benötigen. In solchen Fällen müssen Sie Zeilen dynamisch in Spalten transponieren. Da es in MySQL keine eingebaute Funktion dafür gibt, müssen Sie dies mit einer SQL-Abfrage bewerkstelligen. Hier ist eine SQL-Abfrage zum dynamischen Transponieren von Zeilen in Spalten in MySQL.

So transponieren Sie Zeilen dynamisch in Spalten in MySQL

So erstellen Sie dynamische Pivot-Tabellen in MySQL. 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 Zeilen dynamisch in Spalten transponieren, 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    |
+------------+-------------+-------------+-------------+

Zeilen dynamisch in Spalten transponieren

Wenn Sie bereits vorher wissen, welche Spalten Sie erstellen würden, können Sie einfach eine CASE-Anweisung verwenden, um eine Pivot-Tabelle zu erstellen.

Da wir nicht wissen, welche Spalten erstellt werden sollen, müssen wir mithilfe der GROUP_CONCAT-Funktion Zeilen dynamisch in Spalten transponieren, 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 field_key-Werte aus mehreren Zeilen zu einer einzigen Zeichenfolge verketten. In der obigen Abfrage verwenden wir GROUP_CONCAT, um CASE-Anweisungen basierend auf den eindeutigen Werten in field_key dynamisch zu erstellen -Spalte und speichern Sie diese Zeichenfolge in der @sql-Variablen, die dann zum Erstellen unserer Auswahlabfrage verwendet wird.

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

So können Sie Pivot-Tabellenabfragen in MySQL automatisieren und Zeilen dynamisch in Spalten transponieren.

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 transponieren möchten, können Sie Ihrer ersten select GROUP_CONCAT-Anweisung eine WHERE-Klausel hinzufügen.

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.

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

In ähnlicher Weise können Sie auch JOINS in Ihrer SQL-Abfrage anwenden, während Sie in MySQL Zeilen dynamisch in Spalten transponieren.

Hier ist ein Beispiel für eine mit Ubiq erstellte Pivot-Tabelle.

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