Разделить значения на несколько других столбцов

Код:

CREATE TABLE table1 (
  day DATE,
  name VARCHAR(40)
  );
INSERT INTO table1 (day, name)
VALUES 
('2018-01-01', 'test1'),
('2018-01-01', 'test2'),
('2018-01-01', 'example'),
('2018-01-01', 'somevalue'),
('2018-01-02', 'test3'),
('2018-01-03', 'test4');

Я хочу разбить результат на что-то вроде:

day - name1 - name2 - namex  
DATE - value - value - value 

вместо дублирования даты при выборе данных.

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ :

day - name - name - name - name ...
2018-01-01 - test1 - test2 - example - somevalue
2018-01-02 - NULL - NULL - NULL - NULL - test3

SQL FIDDLE

Пожалуйста, предоставьте образцы данных таблицы и ожидаемый результат в виде форматированного текста.

jarlh 02.05.2018 09:30

поскольку name имеет переменную длину, это невозможно. Вам следует выбрать GROUP BY и GROUP_CONCAT. Отметьте это Скрипка

Yuri 02.05.2018 09:30

Серьезно подумайте о решении проблем с отображением данных в коде приложения.

Strawberry 02.05.2018 09:32

@ Strawberry Вы имеете в виду, как с другим языком, например, с php?

rn605435 02.05.2018 09:39

Я отредактировал данные образца таблицы. Теперь покажите нам ожидаемый результат.

jarlh 02.05.2018 09:39

@ Спасибо за скрипку, я думаю, я могу пойти от этого и адаптировать ее для построения диаграммы с Chartjs, так как это цель

rn605435 02.05.2018 09:40

@jarlh Я добавил ожидаемый результат

rn605435 02.05.2018 09:46

Какая у этого цель? Например, если у вас есть 1000 строк, то в результате у вас будет 1000 столбцов ????

DEarTh 02.05.2018 09:51
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
8
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В этом коде вы группируете по дню и имени и отсортировываете это по возрастанию

SELECT * FROM table1
group by day, name
ORDER BY day ASC;

Проверить на изображение

Не совсем то, о чем просит OP.

DEarTh 02.05.2018 09:43

вы можете сделать это, используя group by и group concat, как показано ниже

select t.day,left(t.data,length(t.data)-1)
from
(
SELECT day,replace(group_concat(concat(name,'-')),',','')as data
FROM table1
group by day
  )t
Ответ принят как подходящий

Вы можете сделать это с помощью динамического sql, сначала найдя отдельные значения имен, а затем построив остальной код вокруг них, например

дано

MariaDB [sandbox]> select * from t;
+------------+-----------+
| day        | name      |
+------------+-----------+
| 2018-01-01 | test      |
| 2018-01-01 | test      |
| 2018-01-01 | example   |
| 2018-01-01 | somevalue |
| 2018-01-02 | test      |
| 2018-01-03 | test      |
+------------+-----------+
6 rows in set (0.00 sec)

set @sql = concat('select day, ',
(select group_concat(maxstr)
from
(select concat('max(case when name = ', char(39),name,char(39),' then  name else null end) as ', concat('name',@rn:=@rn+1)) maxstr
from  
(select distinct name from t) t,(select @rn:=0) rn
) s
)
,
' from t group by day')
;

строит этот код

select day, max(case when name = 'test' then  name else null end) as name1,
        max(case when name = 'example' then  name else null end) as name2,
        max(case when name = 'somevalue' then  name else null end) as name3 
from t group by day;

Что дает такой результат при запуске

+------------+-------+---------+-----------+
| day        | name1 | name2   | name3     |
+------------+-------+---------+-----------+
| 2018-01-01 | test  | example | somevalue |
| 2018-01-02 | test  | NULL    | NULL      |
| 2018-01-03 | test  | NULL    | NULL      |
+------------+-------+---------+-----------+
3 rows in set (0.00 sec)

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

Выполните динамический sql следующим образом:

prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt; 

Другие вопросы по теме