#mysql #sql
#mysql #sql
Вопрос:
Допустим, у меня есть таблица tbl_marks со столбцами и данными, как показано ниже.
name id section1 section2 section3 section4 year
cherry 1 100 101 102 103 2016
cherry 1 200 201 202 203 2015
cherry 1 300 301 302 303 2014
Ожидаемый формат вывода :
cherry 1 100101102103 200201202203 300301302303
Я хотел бы, чтобы были объединены оценки всех разделов за один год, а затем следовали оценки за другой год, разделенные пробелом.
Итак, мне нужно 5 столбцов в одной строке. (имя, идентификатор, оценки года1, оценки года2, оценки года3)
Пожалуйста, дайте мне знать, как я должен обновить запрос ниже. Спасибо.
Запрос : выберите имя, идентификатор, ??? из tbl_marks группировать по идентификатору;
Комментарии:
1. Я попытался отредактировать строки данных для удобства чтения, но вы, похоже, отозвали эти изменения. Способ форматирования данных теперь делает практически невозможным понимание того, как данные группируются
2. можете ли вы уточнить, хотите
100101102103
ли вы,200201202203
и300301302303
в отдельных столбцах в выходных данных или только100101102103 200201202203 300301302303
в одном столбце?
Ответ №1:
Использование GROUP_CONCAT
:
SELECT name,
id,
GROUP_CONCAT(CONCAT(section1, section2, section3, section4)
ORDER BY section1 SEPARATOR ' ')
FROM yourTable
GROUP BY name, id
Этот ответ предполагает, что вы хотите, чтобы в вашем результирующем наборе было три столбца, три столбца — это name
, id
, и список меток CSV для этой группы имен / идентификаторов ( 123,456,789
в данном случае).
SQLFiddle
(любезно предоставлено @Luke)
Комментарии:
1.
GROUP_CONCAT
объединение сгруппированных значений в одно текстовое поле может решить уникальную проблему, но при использовании для поворота в лучшем случае является хрупким решением, зависящим от произвольных разделителей, которые могут легко сломаться во время будущей разработки. На практикеGROUP_CONCAT
следует использовать только для целей отображения.2. Похоже, я пропустил несколько деталей. Я обновил свой вопрос. Пожалуйста, дайте мне знать, как это сделать. Спасибо.
3. Это сработало. Большое спасибо Time и Luke. Нужно немного отредактировать — Удалено одно ), поскольку есть два )) после РАЗДЕЛИТЕЛЯ ‘ ‘.
4. @TimBiegeleisen Я хочу иметь 5 столбцов вместо 3 столбцов в соответствии с моим обновленным вопросом. Сегодня я запустил ваш запрос и обнаружил, что он возвращает только 3 столбца. Пожалуйста, дайте мне знать, как я могу разделить их на 5 столбцов. Спасибо.
5. Я понимаю, что GROUP_CONCAT возвращает строку. Нужно выяснить, как мы можем разделить результат на отдельные столбцы.
Ответ №2:
Процесс, который вы ищете, называется ‘pivoting’ и динамически невозможен в базовом SQL, поскольку это язык, основанный на множествах.
Просто извлеките строки из кода вашей бизнес-логики и превратите их в столбцы.
Ответ №3:
Все, что вам нужно использовать group_concat()
, это функции и concat()
функции MySQL, например
select name, group_concat(concat(value1, value2))
from table
group by name
Вот пример скрипки SQL.
Комментарии:
1. объединяет значения только в столбце, вопросы просят сначала объединить значения в строке, по столбцам, а затем объединить результат этого.
2. Обновлен ответ и соответствующая скрипка.
Ответ №4:
Один из способов решить эту проблему — самосоединение.
SELECT a.id,a.name,CONCAT(a.section1, a.section2, a.section3, a.section4) as val2015
,CONCAT(b.section1, b.section2, b.section3, b.section4) as val2016
,CONCAT(c.section1, c.section2, c.section3, c.section4) as val2017
FROM test a
LEFT JOIN test b
ON b.id=a.id
LEFT JOIN test c
ON c.id=a.id
WHERE a.year=2015 AND b.year=2016 AND c.year=2017
Редактировать: изменен запрос в соответствии с комментариями.
Комментарии:
1. Похоже, я пропустил несколько деталей. Я обновил свой вопрос. Пожалуйста, дайте мне знать, как обойти это. Спасибо.
2. Любой способ иметь динамический и не ограниченный 3 конкретными годами? Что происходит, когда я добавляю строку данных за 2018 год?
3. К сожалению, этот метод ограничен либо жестким кодом каждый год, либо динамическим созданием вопросов на языке сценариев, таком как php. С другой стороны, каждый год получает свой собственный столбец, где метод group_concat помещает все годы, разделенные пробелом, в один столбец. Итак, какой метод вы используете, зависит от желаемого результата и того, как вы можете обработать его на следующем шаге.