Ако сте имали известен брой стойности и за двете 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 |