sql >> Database >  >> RDS >> Mysql

Rijwaarden weergeven als kolommen in MySQL

Soms moet u mogelijk rijen omzetten in kolommen of draaitabellen maken voor rapportagedoeleinden. Aangezien er geen ingebouwde functie is om een ​​draaipunt in MySQL te bereiken, moet u dit doen via een SQL-query om een ​​draairapporttabel te maken. Laten we eens kijken hoe rijwaarden als kolommen in MySQL kunnen worden weergegeven.

Rijwaarden weergeven als kolommen in MySQL

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 rijen dynamisch naar kolommen wilt transponeren, zodat er een nieuwe kolom wordt gemaakt voor elke unieke waarde in field_key kolom, dat is (voornaam, achternaam, beroep)

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

Rijwaarden weergeven als kolommen in MySQL

Als u al weet welke kolommen u wilt maken, kunt u een draaitabel maken met CASE-instructies, zoals hieronder weergegeven, om rijwaarden als kolommen in MySQL weer te geven.

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

Rijwaarden dynamisch weergeven als kolommen in MySQL

Als u de kolomnamen niet van tevoren weet, of rijwaarden dynamisch wilt weergeven als kolommen in MySQL, kunt u dynamische draaitabellen in MySQL maken met de functie GROUP_CONCAT, 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 field_key-waarden van meerdere rijen samenvoegen tot een enkele tekenreeks. In de bovenstaande query gebruiken we GROUP_CONCAT om dynamisch CASE-instructies te maken, gebaseerd op de unieke waarden in field_key kolom en sla die string op in de @sql-variabele, die vervolgens wordt gebruikt om onze selectiequery te maken.

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

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

Als u alleen geselecteerde rijwaarden als kolommen wilt transponeren, kunt u de WHERE-component toevoegen aan uw eerste select GROUP_CONCAT-instructie.

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.

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 rijwaarden als kolommen in MySQL weergeeft.

Nadat u rij naar kolom in MySQL hebt geconverteerd, kunt u een diagramtool gebruiken om het resultaat in een tabel uit te zetten. Hier is een voorbeeld van een draaitabel gemaakt met Ubiq.

Als u draaitabellen, grafieken en dashboards wilt maken vanuit de MySQL-database, kunt u Ubiq proberen. We bieden een gratis proefperiode van 14 dagen aan.

  1. PDO mysql:Hoe weet ik of het invoegen gelukt is?

  2. Wat kan ervoor zorgen dat een Oracle ROWID verandert?

  3. Hoe FOUT op te lossen:kolom c.relhasoids bestaat niet in Postgres?

  4. Kan ik een externe sleutel hebben die verwijst naar een kolom in een weergave in SQL Server?