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

conversão de linha para coluna no mysql


Esse tipo de transformação de dados é conhecido como pivô . O MySQL não tem uma função pivô, então você vai querer transformar os dados usando uma função agregada com um CASE expressão.

Se você souber os valores com antecedência para transformar, poderá codificá-los de forma semelhante a esta:
select studentid,
  sum(case when subject = 'Java' then mark else 0 end) Java,
  sum(case when subject = 'C#' then mark else 0 end) `C#`,
  sum(case when subject = 'JavaScript' then mark else 0 end) JavaScript
from yourtable
group by studentid

Consulte SQL Fiddle with Demo .

Se os valores do assunto forem desconhecidos ou flexíveis, talvez você queira usar uma instrução preparada para gerar sql dinâmico:
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when subject = ''',
      subject,
      ''' then mark else 0 end) AS `',
      subject, '`'
    )
  ) INTO @sql
FROM  yourtable;

SET @sql = CONCAT('SELECT studentid, ', @sql, ' 
                  from yourtable
                  group by studentid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Consulte SQL Fiddle with Demo .

O resultado para ambas as consultas é:
| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
|        10 |   46 | 65 |         79 |
|        11 |   66 | 85 |         99 |