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

Como transpor linhas para colunas dinamicamente no MySQL


Às vezes, seus dados podem ser armazenados em linhas e você pode querer relatá-los como colunas. Nesses casos, você precisará transpor linhas em colunas. Às vezes, mesmo essas linhas podem ser variáveis. Então você pode saber quantas colunas você precisa. Nesses casos, você precisa transpor linhas para colunas dinamicamente. Como não há nenhuma função interna para fazer isso no MySQL, você precisa fazer isso usando uma consulta SQL. Aqui está uma consulta SQL para transpor dinamicamente linhas para colunas no MySQL.


Como transpor linhas para colunas dinamicamente no MySQL


Veja como criar tabelas dinâmicas 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    |
+------------+-------------+-------------+-------------+


Transpor linhas para colunas dinamicamente


Se você já sabe quais colunas você criaria de antemão, você pode simplesmente usar uma instrução CASE para criar uma tabela dinâmica.

Como não sabemos quais colunas serão criadas, teremos que transpor linhas dinamicamente para colunas 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   |
+------------+------------+-----------+------------+

É assim que você pode automatizar consultas de tabela dinâmica no MySQL e transpor linhas para colunas dinamicamente.



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 transpõe linhas para colunas dinamicamente no MySQL.

Aqui está um exemplo de tabela dinâmica criada usando Ubiq.





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