sql >> Databasteknik >  >> RDS >> Mysql

Transponera dynamiska kolumner till rader

MySQL har ingen UNPIVOT-funktion, men du kan konvertera dina kolumner till rader med en UNION ALL .

Grundsyntaxen är:

select id, word, qty
from
(
  select id, 'abc' word, abc qty
  from yt
  where abc > 0
  union all
  select id, 'brt', brt
  from yt
  where brt > 0
) d
order by id;

I ditt fall uppger du att du behöver en lösning för dynamiska kolumner. Om så är fallet måste du använda en förberedd sats för att generera dynamisk SQL:

SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'select id, ''',
      c.column_name,
      ''' as word, ',
      c.column_name,
      ' as qty 
      from yt 
      where ',
      c.column_name,
      ' > 0'
    ) SEPARATOR ' UNION ALL '
  ) INTO @sql
FROM information_schema.columns c
where c.table_name = 'yt'
  and c.column_name not in ('id')
order by c.ordinal_position;

SET @sql 
  = CONCAT('select id, word, qty
           from
           (', @sql, ') x  order by id');


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

Se SQL-fiol med demo



  1. T-SQL:Välja kolumn baserat på MAX(Annan kolumn)

  2. Hur hittar man icke-existerande data från en annan tabell genom att JOIN?

  3. Långsam MySQL-starttid i GTID-läge? Storleken på binär loggfil kan vara problemet

  4. hur man bygger om wf_java_deferred-kön