sql >> Base de Datos >  >> RDS >> Mysql

conversión de fila a columna en mysql

Este tipo de transformación de datos se conoce como pivote. . MySQL no tiene una función pivote, por lo que querrá transformar los datos usando una función agregada con un CASE expresión.

Si conoce los valores con anticipación para transformar, puede codificarlos de manera similar a esto:

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 con demostración .

Si los valores del sujeto son desconocidos o flexibles, es posible que desee utilizar una declaración preparada para generar 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 con demostración .

El resultado de ambas consultas es:

| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
|        10 |   46 | 65 |         79 |
|        11 |   66 | 85 |         99 |