sql >> Database >  >> RDS >> Mysql

Dynamische draaitabellen maken in MySQL

Draaitabellen maken het gemakkelijk om grote hoeveelheden gegevens te analyseren door informatie te ordenen in een kleinere, beheersbare gegevensset. Er is echter geen ingebouwde functie om pivot in MySQL te bereiken. We moeten een SQL-query schrijven om rij naar kolom in MySQL te converteren en vervolgens een draairapport maken in MySQL. Laten we dus eens kijken hoe u dynamische draaitabellen in MySQL kunt maken.

Dynamische draaitabellen maken in MySQL

Als u een draaitabel in MySQL wilt maken, gebruikt u meestal IF/CASE-instructies. Deze aanpak werkt echter alleen als u al weet welke kolommen u in een draaitabel moet maken.

Hoe maakt u dynamische draaitabellen in MySQL, als u niet weet welke kolommen u moet maken of als u verwacht dat deze in de loop van de tijd zullen veranderen? In dergelijke gevallen gebruiken we de GROUP_CONCAT functie.

Stel dat u de volgende tabel heeft

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

Stel dat u een dynamische draaitabel wilt maken, zodat er een nieuwe kolom wordt gemaakt voor elke unieke waarde in field_key kolom, dat wil zeggen (voornaam, achternaam, beroep)

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

Dynamische draaitabellen maken in MySQL

Als u al weet welke kolommen u in een draaitabel moet maken, kunt u een CASE-instructie gebruiken om een ​​draaitabel te maken. Om dynamische draaitabellen in MySQL te maken, gebruiken we echter GROUP_CONCAT functie om rijen dynamisch naar kolommen te transponeren, zoals hieronder weergegeven.

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;

Met GROUP_CONCAT kunt u waarden uit meerdere rijen samenvoegen tot een enkele tekenreeks. In de bovenstaande query gebruiken we GROUP_CONCAT om dynamisch CASE-instructies te maken, gebaseerd op unieke waarden in de field_key kolom en sla die string op in de @sql-variabele. Het wordt vervolgens gebruikt om onze selectiequery te maken.

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

Op deze manier kunt u draaitabellen in MySQL automatiseren.

U kunt de bovenstaande query aanpassen aan uw vereisten door de WHERE-clausule of JOINS toe te voegen.

Als u alleen rijwaarden als kolommen wilt draaien, kunt u de WHERE-component toevoegen aan uw 1e select GROUP_CONCAT-instructie, zoals weergegeven in vet hieronder

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

Als u rijen in uw uiteindelijke draaitabel wilt filteren, kunt u de WHERE-component in uw SET-instructie toevoegen, zoals weergegeven in vet hieronder.

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

Op dezelfde manier kunt u JOINS ook toepassen in uw SQL-query terwijl u dynamische draaitabellen maakt in MySQL.

Nadat u dynamische draaitabellen in MySQL hebt gemaakt, kunt u een rapportagetool gebruiken om deze in een tabel te plotten. Hier is een voorbeeld van een draaitabel gemaakt met Ubiq.

Wist je dat je dynamische draaitabellen in Ubiq kunt maken zonder SQL te schrijven?

Trouwens, als je draaitabellen, grafieken en dashboards wilt maken vanuit de MySQL-database, kun je Ubiq proberen. We bieden een gratis proefperiode van 14 dagen.

  1. Hoe MySQL-tijd te converteren

  2. Hoe kan ik de PostgreSQL-server starten op Mac OS X?

  3. python pip install psycopg2 installatiefout

  4. Hoe de BETWEEN-operator in SQL Server te gebruiken?