sql >> Databasteknik >  >> RDS >> Mysql

rad till kolumn konvertering i mysql

Denna typ av datatransformation är känd som en pivot . MySQL har ingen pivotfunktion, så du vill transformera data med en aggregerad funktion med en CASE uttryck.

Om du vet vilka värden som ska omvandlas i förväg kan du hårdkoda dem liknande detta:

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

Se SQL-fiol med demo .

Om värdena för ämnet är okända eller flexibla, kanske du vill använda en förberedd sats för att generera dynamisk sql:

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;

Se SQL-fiol med demo .

Resultatet för båda frågorna är:

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



  1. Vad är det maximala antalet tecken som nvarchar(MAX) rymmer?

  2. Databasmodell för ett meddelandesystem

  3. MySQL NOT IN från en annan kolumn i samma tabell

  4. GATHER_PLAN_STATISTICS genererar inte grundläggande planstatistik