Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como exibir valores de linha como colunas no MySQL


Às vezes, pode ser necessário transpor linhas em colunas ou criar tabelas dinâmicas para fins de relatório. Como não há função interna para obter o pivô no MySQL, você precisa realizá-lo por meio da consulta SQL para criar uma tabela de relatório dinâmico. Vamos ver como exibir valores de linha como colunas no MySQL.


Como exibir valores de linha como colunas no MySQL


Digamos que você tenha a seguinte tabela.


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

Digamos que você queira transpor linhas para colunas dinamicamente, de modo que uma nova coluna seja criada para cada valor exclusivo em field_key coluna, que é (first_name, last_name, ocupação)


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


Exibir valores de linha como colunas no MySQL


Se você já sabe quais colunas deseja criar, pode criar uma tabela dinâmica usando instruções CASE, conforme mostrado abaixo, para exibir valores de linha como colunas no 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   |
+------------+------------+-----------+------------+




Exibir valores de linha como colunas no MySQL dinamicamente


Se você não conhece os nomes das colunas de antemão, ou deseja exibir valores de linha como colunas no MySQL dinamicamente, você pode criar tabelas dinâmicas dinâmicas no MySQL usando a função GROUP_CONCAT, conforme mostrado abaixo.
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 permite concatenar valores field_key de várias linhas em uma única string. Na consulta acima, usamos GROUP_CONCAT para criar instruções CASE dinamicamente, com base nos valores exclusivos em field_key column e armazene essa string na variável @sql, que é usada para criar nossa consulta de seleção.
+------------+------------+-----------+------------+
| Meeting_id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Você pode personalizar a consulta acima de acordo com seus requisitos adicionando a cláusula WHERE ou JOINS.



Se você deseja transpor apenas valores de linha selecionados como colunas, você pode adicionar a cláusula WHERE em sua primeira instrução GROUP_CONCAT selecionada.
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when field_key = ''',
      field_key,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql
FROM
  Meeting
WHERE <condition>;


Se você deseja filtrar linhas em sua tabela dinâmica final, pode adicionar a cláusula WHERE em sua instrução SET.
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting WHERE <condition>
                   GROUP BY Meeting_id');

Da mesma forma, você também pode aplicar JOINS em sua consulta SQL enquanto exibe valores de linha como colunas no MySQL.

Depois de converter linha em coluna no MySQL, você pode usar uma ferramenta de gráficos para plotar o resultado em uma tabela. Aqui está um exemplo de uma tabela dinâmica criada usando o Ubiq.





Se você deseja criar tabelas dinâmicas, gráficos e painéis do banco de dados MySQL, experimente o Ubiq. Oferecemos um teste gratuito de 14 dias.