Запрос Mysql для динамического преобразования строк в столбцы на основе двух столбцов

Я задал здесь вопрос, чтобы использовать запрос Mysql для динамической конвертации строк в столбцы. Это отлично работает, но мне нужно преобразовать это на основе двух столбцов,

Запрос, упомянутый в ссылке выше, работает для одного столбца «данные», но я хочу работать для двух столбцов, которые являются «данными» и «ценой».

я добавил пример здесь,

Учитывая таблицу A, которая выглядит как

Table A | id|order|data|item|Price| -----+-----+---------------- | 1| 1| P| 1 | 50 | | 1| 1| P| 2 | 60 | | 1| 1| P| 3 | 70 | | 1| 2| Q| 1 | 50 | | 1| 2| Q| 2 | 60 | | 1| 2| Q| 3 | 70 | | 2| 1| P| 1 | 50 | | 2| 1| P| 2 | 60 | | 2| 1| P| 4 | 80 | | 2| 3| S| 1 | 50 | | 2| 3| S| 2 | 60 | | 2| 3| S| 4 | 80 | 

Мне нравится писать запрос, который выглядит следующим образом:

 Result Table | id|order1|order2|order3|item1|item2|item3|item4| -----+-----+--------------------------------------- | 1| P | Q | | 50 | 60 | 70 | | | 2| P | | S | 50 | 60 | | 80 | 

Я попытался создать два разных запроса, а затем присоединиться к этому, но это может быть не лучшим решением. Может ли кто-нибудь предложить решение такое же, как указано в ссылке выше.

благодаря

Если у вас было известное количество значений как для order и для item , вы можете запрограммировать запрос:

 select id, max(case when `order` = 1 then data end) order1, max(case when `order` = 2 then data end) order2, max(case when `order` = 3 then data end) order3, max(case when item = 1 then price end) item1, max(case when item = 2 then price end) item2, max(case when item = 3 then price end) item3, max(case when item = 4 then price end) item4 from tableA group by id; 

См. Демонстрацию . Но часть проблемы, которую вы собираетесь иметь, состоит в том, что вы пытаетесь преобразовать несколько столбцов данных. Мое предложение получить конечный результат было бы сначала отключить данные. У MySQL нет функции univot, но вы можете использовать UNION ALL для преобразования нескольких пар столбцов в строки. Код для univot будет похож на следующий:

 select id, concat('order', `order`) col, data value from tableA union all select id, concat('item', item) col, price value from tableA; 

См. Демонстрацию . Результатом этого будет:

 | ID | COL | VALUE | ----------------------- | 1 | order1 | P | | 1 | order1 | P | | 1 | order1 | P | | 1 | item1 | 50 | | 1 | item2 | 60 | | 1 | item3 | 70 | 

Как вы можете видеть, это заняло несколько столбцов order / data и item / price и конвертировало его в несколько строк. Как только это будет завершено, вы можете преобразовать значения обратно в столбцы, используя агрегированную функцию с CASE:

 select id, max(case when col = 'order1' then value end) order1, max(case when col = 'order2' then value end) order2, max(case when col = 'order3' then value end) order3, max(case when col = 'item1' then value end) item1, max(case when col = 'item2' then value end) item2, max(case when col = 'item3' then value end) item3 from ( select id, concat('order', `order`) col, data value from tableA union all select id, concat('item', item) col, price value from tableA ) d group by id; 

См. Демонстрацию . Наконец, вам нужно преобразовать вышеуказанный код в запрос динамической подготовленной инструкции:

 SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when col = ''', col, ''' then value end) as `', col, '`') ) INTO @sql FROM ( select concat('order', `order`) col from tableA union all select concat('item', `item`) col from tableA )d; SET @sql = CONCAT('SELECT id, ', @sql, ' from ( select id, concat(''order'', `order`) col, data value from tableA union all select id, concat(''item'', item) col, price value from tableA ) d group by id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

См. SQL-скрипт с демонстрацией . Это дает результат:

 | ID | ORDER1 | ORDER2 | ORDER3 | ITEM1 | ITEM2 | ITEM3 | ITEM4 | ------------------------------------------------------------------- | 1 | P | Q | (null) | 50 | 60 | 70 | (null) | | 2 | P | (null) | S | 50 | 60 | (null) | 80 | 
  • Динамическая сводная таблица MySQL
  • Максимальное количество записей в таблице базы данных MySQL
  • Как применить стиль ко всем кнопкам приложения для Android
  • Динамически создавать столбцы для кросс-таблицы в PostgreSQL
  • Interesting Posts

    Pandas: конвертировать категории в номера

    Загрузите файл через HTTP-форму через MultipartEntityBuilder с индикатором выполнения

    Как это возможно? Сервис работает неограниченно, а также разрешает привязку к андроиду?

    Есть ли причины использовать частные объекты в C #?

    Является ли использование Serializable в Android плохим?

    Проблема с кабелем DVI-HDMI

    Возможно ли создать навигационное приложение «Пошаговый поворот» на Android с помощью Google Maps?

    Если Menber Active, чем имя залива, еще проверьте другое в excel

    Как исправить сглаживание шрифтов в IntelliJ IDEA при использовании высокого DPI?

    Как реализовать разбиение на страницы весной MVC 3

    Как читать содержимое каталога в Perl?

    Управление группами пользователей и ролями в .NET с помощью Active Directory

    Статические IP-адреса VMware – CentOS 6.5

    Лучший способ справиться с безопасностью и избежать XSS с введенными пользователями URL-адресами

    C ++ ловит все исключения

    Давайте будем гением компьютера.