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

Mysql заявка за динамично преобразуване на редове в колони на базата на две колони

Ако сте имали известен брой стойности и за двете order и item , тогава бихте могли да кодирате заявката в:

изберете идентификатор, max(случай, когато „поръчка“ =1, след това край на данните) поръчка1, макс(случай, когато „поръчка“ =2, след това край на данните) поръчка2, макс(случай, когато „поръчка“ =3, след това данни край) поръчка3, макс(случай, когато артикул =1, след това край на цената) item1, max(случай, когато артикул =2, след това край на цената) item2, max(случай, когато артикул =3, след това край на цената) item3, max(случай, когато артикул =4 след това край на цената) item4from tableAgroup по id; 

Вижте Демо . Но част от проблема, който ще имате, е, че се опитвате да трансформирате множество колони с данни. Моето предложение, за да получите крайния резултат, би било първо да размените данните. MySQL няма функция unpivot, но можете да използвате UNION ALL, за да преобразувате множеството двойки колони в редове. Кодът за развъртане ще бъде подобен на следния:

select id, concat('order', `order`) col, data valuefrom tableAunion allselect id, concat('item', item) col, price valuefrom tableA; 

Вижте Демо . Резултатът от това ще бъде:

<предварителен код>| ID | COL | СТОЙНОСТ |-----------------------| 1 | поръчка1 | P || 1 | поръчка1 | P || 1 | поръчка1 | P || 1 | артикул 1 | 50 || 1 | елемент2 | 60 || 1 | елемент3 | 70 |

Както можете да видите, това е заело множеството колони от order /данни и item /цена и го преобразувайте в няколко реда. След като това приключи, можете да преобразувате стойностите обратно в колони, като използвате агрегатна функция със CASE:

изберете идентификатор, max(случай, когато col ='order1', след това край на стойност) поръчка1, max(случай, когато col ='order2', след това край на стойност) order2, max(случай, когато col ='order3', след това стойност край) поръчка3, макс(случай, когато col ='item1', след това край на стойността) item1, max(случай, когато col ='item2', след това край на стойността) item2, max(случай, когато col ='item3', след това край на стойност) item3from( изберете id, concat('order', 'order`) col, стойност на данните от tableA union all select id, concat('item', item) col, ценова стойност от tableA) dgroup by id; 

Вижте Демо . И накрая, трябва да преобразувате горния код в динамично подготвена заявка:

SET @sql =NULL;ИЗБЕРЕТЕ GROUP_CONCAT(DISTINCT CONCAT( 'max(случай, когато col =''', col, ''' след това край на стойността) като `', col, '`') ) INTO @sqlFROM( изберете concat('order', `order`) col от tableA union all select concat('item', `item`) col от tableA)d;SET @sql =CONCAT('SELECT id, ', @sql , ' от ( изберете id, concat(''order'', `order`) col, стойност на данните от tableA union all select id, concat(''item'', item) col, price value from tableA ) d група от id');ПРОГОТВЕТЕ stmt ОТ @sql;ИЗПЪЛНЕТЕ stmt;ПРЕЗПЕЧЕТЕ ПОДГОТОВЯТЕ stmt; 

Вижте SQL Fiddle с демонстрация . Това дава резултат:

<предварителен код>| ID | ПОРЪЧКА1 | ПОРЪЧКА2 | ПОРЪЧКА3 | ITEM1 | ITEM2 | ITEM3 | ITEM4 |------------------------------------------------ -------------------| 1 | P | Q | (нула) | 50 | 60 | 70 | (нула) || 2 | P | (нула) | S | 50 | 60 | (нула) | 80 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Балансиране на натоварването на PostgreSQL и подобрения на ProxySQL - ClusterControl 1.5

  2. Как да премахнете водещите празни места в MySQL

  3. Клауза за MySQL UNION

  4. Възстановете базата данни на mysql от .frm файлове

  5. Завършете урока за Soft Delete &Restore Laravel 8 за изтрити записи