#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