sql >> Database >  >> RDS >> Mysql

rij naar kolom conversie in mysql

Dit type gegevenstransformatie staat bekend als een pivot . MySQL heeft geen spilfunctie, dus u zult de gegevens willen transformeren met behulp van een aggregatiefunctie met een CASE uitdrukking.

Als je de waarden van tevoren weet om te transformeren, dan kun je ze hardcoderen zoals dit:

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

Zie SQL Fiddle met demo .

Als de waarden van het onderwerp onbekend of flexibel zijn, wilt u misschien een voorbereide instructie gebruiken om dynamische sql te genereren:

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;

Zie SQL Fiddle met demo .

Het resultaat voor beide zoekopdrachten is:

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



  1. Loop over een insert-query in PHP

  2. Hoe CSV-bestandsgegevens importeren in een PostgreSQL-tabel?

  3. Log DBMS_OUTPUT.Put_Line-uitvoer in tabel in Oracle met DBMS_OUTPUT.Get_Lines

  4. Beperking Schending bij volharden Een-op-veel-relatie