Mysql
 sql >> база данни >  >> RDS >> Mysql

Динамична заявка в MySQL

За да получите желания резултат, ще трябва и двете да отмените завъртане текущите данни от колони в редове и след това завъртете годината данни от редове в колони.

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 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да конвертирате IPv6 от двоичен файл за съхранение в MySQL

  2. Не може да се увеличи max_open_files за Mysql max-connections в Ubuntu 15

  3. Мога ли да използвам ON DUPLICATE KEY UPDATE със заявка INSERT, използвайки опцията SET?

  4. Управление на количката и складовите наличности

  5. Neo4j език за заявки - Cypher