Код:
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
поскольку name
имеет переменную длину, это невозможно. Вам следует выбрать GROUP BY
и GROUP_CONCAT
. Отметьте это Скрипка
Серьезно подумайте о решении проблем с отображением данных в коде приложения.
@ Strawberry Вы имеете в виду, как с другим языком, например, с php?
Я отредактировал данные образца таблицы. Теперь покажите нам ожидаемый результат.
@ Спасибо за скрипку, я думаю, я могу пойти от этого и адаптировать ее для построения диаграммы с Chartjs, так как это цель
@jarlh Я добавил ожидаемый результат
Какая у этого цель? Например, если у вас есть 1000 строк, то в результате у вас будет 1000 столбцов ????
В этом коде вы группируете по дню и имени и отсортировываете это по возрастанию
SELECT * FROM table1
group by day, name
ORDER BY day ASC;
Проверить на изображение
Не совсем то, о чем просит OP.
вы можете сделать это, используя 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;
Пожалуйста, предоставьте образцы данных таблицы и ожидаемый результат в виде форматированного текста.