Как мне свернуть эту исходную таблицу

#mysql #sql

Вопрос:

У меня есть такой столик:

 Position | EmpNumber | Name | Status 1 | 1234 | Fred | Active 2 | 1235 | Popeye | Active 2 | 1236 | Olive | Active 2 | 1237 | Scooby | Active 2 | 1238 | Homer | Active 3 | 1239 | Bart | Active 3 | 1240 | Tom | Active 4 | 1241 | Jerry | Active 5 | 1242 | Bugs Bunny | Active  

Я хочу запросить это и повернуть его, поэтому я получаю позицию (столбец 1) Только один раз и столбцы для каждого номера EMP (столбец 2) с псевдонимами Emp1, Emp2 и т. Д. худшим случаем когда-либо будет 4 числа против каждой позиции. Таким образом, мои требуемые результаты будут:

 Position | Emp1 | Emp2 | Emp3 | Emp4 1 | Fred | NULL | NULL | NULL 2 | Popeye | Olive | Scooby | Homer 3 | Bart | Tom | NULL | NULL 4 | Jerry | NULL | NULL | NULL 5 | Bugs Bunny | NULL | NULL | NULL  

Я хочу, чтобы все атрибуты для каждой строки были,возможно,в виде отдельных столбцов или, возможно, объединены в одно поле, например «1234, Фред, активен», но только что использовал столбец » Имя » выше, чтобы пока все было просто.

Также интересует, как сделать его динамичным на случай, если в позиции когда-либо появятся дополнительные строки.

Комментарии:

1. Откуда берутся имена столбцов Emp1 Emp2 в исходной таблице?

2. Я думаю, ты просто хочешь GROUP_CONCAT(Name) и GROUP BY Position .

3. Создавал псевдонимы для новых столбцов. 4 колонки (в худшем случае позиция 2 содержит 4 сотрудника, следовательно, Emp1, Emp2 и т. Д.

4. Сводная таблица перемещает повторяющиеся значения данных в имена столбцов. В таблице нет никакой Emp1 ценности.

5. Другими словами, почему Popeye находится в столбце Emp1, а не в столбце Emp2?

Ответ №1:

Используйте GROUP_CONCAT() в подзапросе, чтобы объединить все имена из одной позиции в список, разделенный запятыми, а затем используйте SUBSTRING_INDEX() в основном запросе, чтобы извлечь их в отдельные столбцы.

 SELECT position,   SUBSTRING_INDEX(names, ',', 1) AS Name1,  IF(namecount gt; 1, SUBSTRING_INDEX(SUBSTRING_INDEX(names, ',', 2), ',', -1), NULL) AS Name2,  IF(namecount gt; 2, SUBSTRING_INDEX(SUBSTRING_INDEX(names, ',', 3), ',', -1), NULL) AS Name3,  IF(namecount gt; 3, SUBSTRING_INDEX(SUBSTRING_INDEX(names, ',', 4), ',', -1), NULL) AS Name4 FROM (  SELECT position, GROUP_CONCAT(name ORDER BY EmpNumber) AS names, COUNT(*) AS namecount  FROM yourTable   GROUP BY position ) AS subquery