Заголовки столбцов MySQL в один столбец, второй столбец для значений [дубликаты]

В настоящее время у меня есть таблица, которая показывает нужные мне данные в формате

SELECT * FROM XYZ;

Date | Brand | Game1| Game2 | Game3  |  
2017 | xxxxx  | xxxxxx  | ---------- | -----------|

2017 | xxxxx  | ----------| yyyyyyy | -----------|

2017 | xxxxx  | ----------| -----------| yyyyyyy |

То, как я хотел бы, чтобы данные были представлены, состоит из 4 столбцов, например:

Date | Brand | GameName | Value

2017 | xxxxx | Game1 | 1234567.89

2017 | xxxxx | Game2 | 98.7654321

2017 | xxxxx | Game3 | 12345987.65

Это делается для того, чтобы упростить фильтрацию данных для поиска конкретных значений.

Я пробовал большинство других предложений по SO, но пока не добился большого успеха.

(например, group_concat).

Одно из предложений, которое действительно сработало, заключалось в том, чтобы сделать Union all, однако мне нужен динамический запрос, так как таблица будет продолжать добавляться в будущем.

В настоящее время я пытаюсь настроить курсор для этого.


person davo777    schedule 25.09.2017    source источник
comment
Что это за штрихи? Являются ли они действительно тире или там что-то еще, например. пустая строка или ноль?   -  person Tim Biegeleisen    schedule 25.09.2017
comment
В таблице они просто 0   -  person davo777    schedule 25.09.2017
comment
В этом вопросе кто-то задал аналогичный вопрос. Ключевое слово здесь transponding или unpivot. stackoverflow.com/questions/31238717/   -  person Jan Zeiseweis    schedule 25.09.2017


Ответы (3)


Если в вашей таблице будут появляться новые столбцы, то какой бы запрос вы ни использовали, вам придется сначала получить все столбцы из INFORMATION_SCHEMA.TABLE, вот подход:

  • Получить все имена столбцов с шаблоном %Game%
  • Используйте UNION или любой другой запрос, чтобы получить вывод

Ниже приведен пример:

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='db_name' 
    AND `TABLE_NAME`='table'
    AND COLUMN_NAME LIKE '%Game%';

Теперь из вывода этого запроса создайте динамический запрос UNION, например:

SELECT Date, Brand, `<column>`, Value
FROM table

UNION

SELECT Date, Brand, `<column>`, Value
FROM table
person Darshan Mehta    schedule 25.09.2017
comment
Как я могу получить <column> за финальным столом, если его не к чему присоединить? - person davo777; 25.09.2017
comment
Вы должны повторить набор результатов первого запроса и создать запросы на объединение для конечного результата. <column> — это просто значение строки из первого запроса. - person Darshan Mehta; 25.09.2017

Вы можете сделать unpivot в сочетании с агрегацией, чтобы получить желаемый результат. Обратите внимание, что значение, которое вы хотите вычислить для каждой игры, совпадает с суммой соответствующего столбца игры. Это так, потому что вы сказали, что все остальные значения равны нулю.

SELECT
    Date,
    MAX(CASE WHEN Game1 <> 0 THEN Brand END) AS Brand,
    'Game1' AS GameName,
    SUM(Game1) AS Value
FROM yourTable
GROUP BY Date
UNION ALL
SELECT
    Date, MAX(CASE WHEN Game2 <> 0 THEN Brand END), 'Game2', SUM(Game2)
FROM yourTable
GROUP BY Date
UNION ALL
SELECT
    Date, MAX(CASE WHEN Game3 <> 0 THEN Brand END), 'Game3', SUM(Game3)
FROM yourTable
GROUP BY Date

Демо здесь:

Рекстестер

person Tim Biegeleisen    schedule 25.09.2017

Это должно работать

select Date, Brand, 'Game1', Game1 where Game1 is not null
UNION ALL
select Date, Brand, 'Game2' Game2 where Game2 is not null
UNION ALL
select Date, Brand, 'Game3' Game3 where Game3 is not null

вы можете сохранить это как представление и запросить его непосредственно для ваших результатов

person jidexl21    schedule 25.09.2017
comment
MySQL не поддерживает CTE, но в любом случае ваши данные не соответствуют данным в вопросе, см. приведенные выше комментарии. - person Tim Biegeleisen; 25.09.2017
comment
в этом случае я удалю cte и реструктурирую данные - person jidexl21; 25.09.2017
comment
Это сработает, но проблема в том, что мне нужен динамический запрос - person davo777; 25.09.2017