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

So zeigen Sie Zeilenwerte als Spalten in MySQL an

Manchmal müssen Sie möglicherweise Zeilen in Spalten transponieren oder Pivot-Tabellen für Berichtszwecke erstellen. Da es in MySQL keine integrierte Funktion zum Erreichen von Pivot gibt, müssen Sie dies über eine SQL-Abfrage erreichen, um eine Pivot-Berichtstabelle zu erstellen. Sehen wir uns an, wie Zeilenwerte in MySQL als Spalten angezeigt werden.

So zeigen Sie Zeilenwerte als Spalten in MySQL an

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    |
+------------+-------------+-------------+-------------+

Zeilenwerte als Spalten in MySQL anzeigen

Wenn Sie bereits wissen, welche Spalten Sie erstellen möchten, können Sie mithilfe von CASE-Anweisungen eine Pivot-Tabelle erstellen, wie unten gezeigt, um Zeilenwerte als Spalten in MySQL anzuzeigen.

mysql> select meeting_Id,
         max(case when (field_key='first_name') then field_value else NULL end) as 'first_name',
         max(case when (field_key='last_name') then field_value else NULL end) as 'last_name',
         max(case when (field_key='occupation') then field_value else NULL end) as 'occupation'
         from meeting
         group by meeting_Id
         order by meeting_Id;
+------------+------------+-----------+------------+
| meeting_Id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Zeilenwerte als Spalten in MySQL dynamisch anzeigen

Wenn Sie die Spaltennamen nicht vorher kennen oder Zeilenwerte dynamisch als Spalten in MySQL anzeigen möchten, können Sie dynamische Pivot-Tabellen in MySQL mit der GROUP_CONCAT-Funktion erstellen, 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   |
+------------+------------+-----------+------------+

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');

Ebenso können Sie auch JOINS in Ihrer SQL-Abfrage anwenden, während Sie Zeilenwerte als Spalten in MySQL anzeigen.

Nachdem Sie in MySQL Zeile in Spalte konvertiert haben, können Sie ein Diagrammtool verwenden, um das Ergebnis in einer Tabelle darzustellen. Hier ist ein Beispiel für eine Pivot-Tabelle, die mit Ubiq erstellt wurde.

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.