Intereting Posts
SQL – используйте ссылку CTE на другой CTE Как я могу ввести несколько условий в LIKE-оператор WHERE, чтобы найти все записи за определенный месяц Выберите несколько столбцов из двух таблиц, используя greendao Teradata: Как создать резервную копию таблицы, в которой используется столбец идентификатора? Демонстрация нападений SQL-инъекций моему боссу Как проверить длину строки, а затем выбрать подстроку в Sql Server TSQL – вставить строку в целое число или вернуть значение по умолчанию Перемещение строк вверх и вниз в базе данных (помощь SQL-запроса) Использование переменной для указания «размера» при объявлении VARBINARY Использование SQL для определения значения cidr для маски подсети Недопустимое значение по умолчанию для 'dateAdded' Доступ к последней вставленной строке в mysql Уменьшение количества запросов для внутреннего соединения при присоединении базы к одной таблице Как использовать переменные в инструкции SQL в Python?

Mysql Преобразование столбца в строку (сводная таблица)

У меня есть таблица, подобная этой

+---+-----+----+----+----+----+ |id |month|col1|col2|col3|col4| +---+-----+----+----+----+----+ |101|Jan |A |B |NULL|B | +---+-----+----+----+----+----+ |102|feb |C |A |G |E | +---+-----+----+----+----+----+ 

И тогда я хочу создать отчет, подобный этому

 +----+---+---+ |desc|jan|feb| +----+---+---+ |col1|A |C | +----+---+---+ |col2|B |A | +----+---+---+ |col3|0 |G | +----+---+---+ |Col4|B |E | +----+---+---+ 

Может кто-нибудь помочь с этим?

То, что вам нужно сделать, это, во-первых, отключить данные и затем развернуть его. Но, к сожалению, у MySQL нет этих функций, поэтому вам нужно будет их реплицировать, используя запрос UNION ALL для функции univot и aggregate с CASE для точки опоры.

Кусок univot или UNION ALL берет данные из ваших col1, col2 и т. Д. И превращает их в несколько строк:

 select id, month, col1 value, 'col1' descrip from yourtable union all select id, month, col2 value, 'col2' descrip from yourtable union all select id, month, col3 value, 'col3' descrip from yourtable union all select id, month, col4 value, 'col4' descrip from yourtable 

См. SQL Fiddle with Demo .

Результат:

 | ID | MONTH | VALUE | DESCRIP | ---------------------------------- | 101 | Jan | A | col1 | | 102 | feb | C | col1 | | 101 | Jan | B | col2 | | 102 | feb | A | col2 | | 101 | Jan | (null) | col3 | | 102 | feb | G | col3 | | 101 | Jan | B | col4 | | 102 | feb | E | col4 | 

Затем оберните это в подзапрос, чтобы применить агрегат и CASE чтобы преобразовать это в желаемый формат:

 select descrip, max(case when month = 'jan' then value else 0 end) jan, max(case when month = 'feb' then value else 0 end) feb from ( select id, month, col1 value, 'col1' descrip from yourtable union all select id, month, col2 value, 'col2' descrip from yourtable union all select id, month, col3 value, 'col3' descrip from yourtable union all select id, month, col4 value, 'col4' descrip from yourtable ) src group by descrip 

См. SQL Fiddle с демонстрацией

Результат:

 | DESCRIP | JAN | FEB | ----------------------- | col1 | A | C | | col2 | B | A | | col3 | 0 | G | | col4 | B | E |