sql >> Database teknologi >  >> RDS >> Mysql

række til kolonne konvertering i mysql

Denne type datatransformation er kendt som en pivot . MySQL har ikke en pivotfunktion, så du vil transformere dataene ved hjælp af en aggregeret funktion med en CASE udtryk.

Hvis du kender værdierne i forvejen, der skal transformeres, så kan du hårdkode dem svarende til dette:

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 Fiddle with Demo .

Hvis værdierne for emnet er ukendte eller fleksible, vil du måske bruge en forberedt erklæring til at generere 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 Fiddle with Demo .

Resultatet for begge forespørgsler er:

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


  1. Hvad betyder tallet i parentes egentlig?

  2. Eksekveres FØR INSERT-trigger for hver række i indsæt på dubletnøgleopdateringsforespørgsel

  3. Hvordan kan jeg rette denne fejl:ikke understøttet SQL92?

  4. AES-kryptering i mysql og php