За да получите желания резултат, ще трябва и двете да отмените завъртане текущите данни от колони в редове и след това завъртете годината
данни от редове в колони.
MySQL няма функция PIVOT или UNPIVOT, така че ще трябва да използвате UNION ALL
заявка за развъртане и агрегатна функция с CASE
израз за завъртане.
Ако имате известен брой стойности, тогава можете да кодирате стойности, подобни на това:
изберете locid, event, max(случай, когато годината =2011, след това край на стойността) `2011`, max(случай, когато годината =2012, след това края на стойността) `2012`from( изберете LocId, Year, 'Birth' събитие, Стойност на раждането от yt union, всички изберете LocId, Year, 'Death' event, Death value from yt union всички изберете LocId, Year, 'Abc' event, Abc value от yt) dgroup по locid, event;
Вижте SQL Fiddle с демонстрация .
Но ако ще имате неизвестен брой стойности, тогава ще трябва да използвате подготвен израз за генериране на динамичен SQL. Кодът ще бъде подобен на следния:
SET @sql =NULL;SET @sqlUnpiv =NULL;SET @sqlPiv =NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'изберете locid, year, ''', c.column_name, ''' като събитие, ', c.column_name, ' като стойност от yt ' ) SEPARATOR ' UNION ALL ' ) INTO @sqlUnpivFROM information_schema.columns c, където c.table_name ='yt' и c.column_name не е в ('LocId') или 'Year' c.ordinal_position;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(CASE WHEN year =', year, ' THEN value else null END) AS `', year, '`' ) ) INTO @sqlPivFROM yt;SET @sql =CONCAT( 'ИЗБЕРЕТЕ locid, събитие, ', @sqlPiv, ' от ( ', @sqlUnpiv, ' ) d група по locid, събитие');ПРИГОТОВЯТЕ stmt ОТ @sql;ИЗПЪЛНЯВАНЕ stmt;ПРЕЗПЕЧЕТЕ ПОДГОТОВКА stmt;
Вижте SQL Fiddle с демонстрация . Резултатът и за двете заявки е:
<предварителен код>| LOCID | СЪБИТИЕ | 2011 г. | 2012 |------------------------------| 1 | Abc | 10 | 20 || 1 | Раждане | 100 | 98 || 1 | Смърт | 60 | 70 |