sql >> Database teknologi >  >> RDS >> Mysql

Sådan vises rækkeværdier som kolonner i MySQL

Nogle gange kan det være nødvendigt at transponere rækker til kolonner eller oprette pivottabeller til rapporteringsformål. Da der ikke er nogen indbygget funktion til at opnå pivot i MySQL, skal du udføre det via SQL-forespørgsel for at oprette pivotrapporttabel. Lad os se, hvordan du viser rækkeværdier som kolonner i MySQL.

Sådan vises rækkeværdier som kolonner i MySQL

Lad os sige, at du har følgende tabel.

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

Lad os sige, at du vil transponere rækker til kolonner dynamisk, således at der oprettes en ny kolonne for hver unik værdi i field_key kolonne, det vil sige (fornavn, efternavn, stilling)

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

Vis rækkeværdier som kolonner i MySQL

Hvis du allerede ved, hvilke kolonner du vil oprette, kan du oprette en pivottabel ved hjælp af CASE-sætninger, som vist nedenfor, for at vise rækkeværdier som kolonner i MySQL.

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

Vis rækkeværdier som kolonner i MySQL dynamisk

Hvis du ikke kender kolonnenavnene i forvejen eller ønsker at vise rækkeværdier som kolonner i MySQL dynamisk, kan du oprette dynamiske pivottabeller i MySQL ved hjælp af GROUP_CONCAT-funktionen, som vist nedenfor.

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 giver dig mulighed for at sammenkæde feltnøgleværdier fra flere rækker til en enkelt streng. I ovenstående forespørgsel bruger vi GROUP_CONCAT til dynamisk at oprette CASE-sætninger baseret på de unikke værdier i field_key kolonne og gem den streng i @sql variabel, som derefter bruges til at oprette vores udvalgte forespørgsel.

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

Du kan tilpasse ovenstående forespørgsel efter dine krav ved at tilføje WHERE-klausul eller JOINS.

Hvis du kun vil transponere udvalgte rækkeværdier som kolonner, kan du tilføje WHERE-sætning i din 1. select GROUP_CONCAT-sætning.

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

Hvis du vil filtrere rækker i din sidste pivottabel, kan du tilføje WHERE-sætningen i din SET-sætning.

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

På samme måde kan du også anvende JOINS i din SQL-forespørgsel, mens du viser rækkeværdier som kolonner i MySQL.

Når du har konverteret række til kolonne i MySQL, kan du bruge et diagramværktøj til at plotte resultatet i en tabel. Her er et eksempel på en pivottabel oprettet ved hjælp af Ubiq.

Hvis du vil oprette pivottabeller, diagrammer og dashboards fra MySQL-databasen, kan du prøve Ubiq. Vi tilbyder en 14-dages gratis prøveperiode.

  1. Sortering i MySQL ved hjælp af rækkefølge efter klausul

  2. Sådan bruger du Case Statement til betinget formatering i Select Query - SQL Server / TSQL Tutorial Del 116

  3. Sådan fjerner du en adgangskode fra en database i Access 2016

  4. 1064 fejl i CREATE TABLE ... TYPE=MYISAM