sql >> Databasteknik >  >> RDS >> Mysql

Hur man skapar dynamiska pivottabeller i MySQL

Pivottabeller gör det enkelt att analysera stora datamängder genom att organisera information i en mindre, hanterbar datamängd. Det finns dock ingen inbyggd funktion för att uppnå pivot i MySQL. Vi måste skriva en SQL-fråga för att konvertera rad till kolumn i MySQL och sedan skapa en pivotrapport i MySQL. Så låt oss titta på hur man skapar dynamiska pivottabeller i MySQL.

Hur man skapar dynamiska pivottabeller i MySQL

Om du vill skapa en pivottabell i MySQL, använder du vanligtvis IF/CASE-satser. Det här tillvägagångssättet fungerar dock bara när du redan känner till alla kolumner du behöver skapa i en pivottabell.

Hur skapar du dynamiska pivottabeller i MySQL, när du inte vet vilka kolumner som ska skapas, eller om du förväntar dig att de kommer att förändras över tiden? I sådana fall använder vi GROUP_CONCAT funktion.

Låt oss säga att du har följande tabell

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

Låt oss säga att du vill skapa en dynamisk pivottabell, så att en ny kolumn skapas för varje unikt värde i field_key kolumn, det vill säga (förnamn, efternamn, yrke)

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

Skapa dynamiska pivottabeller i MySQL

Om du redan vet vilka kolumner du ska skapa i pivottabellen kan du använda en CASE-sats för att skapa en pivottabell. Men för att skapa dynamiska pivottabeller i MySQL använder vi GROUP_CONCAT funktion för att dynamiskt överföra rader till kolumner, som visas nedan.

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;

GROUP_CONCAT låter dig sammanfoga värden från flera rader till en enda sträng. I ovanstående fråga använder vi GROUP_CONCAT för att dynamiskt skapa CASE-satser, baserat på unika värden i fältnyckeln kolumn och lagra den strängen i variabeln @sql. Den används sedan för att skapa vår urvalsfråga.

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

På så sätt kan du automatisera pivottabellsfrågor i MySQL.

Du kan anpassa ovanstående fråga enligt dina krav genom att lägga till WHERE-klausul eller JOINS.

Om du bara vill pivotera valda radvärden som kolumner, kan du lägga till WHERE-satsen i din första select GROUP_CONCAT-sats, som visas i fetstil nedan

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

Om du vill filtrera rader i din sista pivottabell kan du lägga till WHERE-satsen i din SET-sats som visas i fetstil nedan.

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

På samma sätt kan du också använda JOINS i din SQL-fråga medan du skapar dynamiska pivottabeller i MySQL.

När du väl har skapat dynamiska pivottabeller i MySQL kan du använda ett rapportverktyg för att plotta det i en tabell. Här är ett exempel på en pivottabell skapad med Ubiq.

Visste du att du kan skapa dynamiska pivottabeller i Ubiq utan att skriva någon SQL?

Förresten, om du vill skapa pivottabeller, diagram &instrumentpaneler från MySQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.

  1. Barkers notation

  2. Hur man gör punkt-i-tid-återställning av MySQL- och MariaDB-data med ClusterControl

  3. MySQL/PHP-fel:[2002] Endast en användning av varje socketadress (protokoll/nätverksadress/port) är normalt tillåten

  4. SQL Server:Databasen har fastnat i återställningsläge