Разделить значения на несколько других столбцов - PullRequest
0 голосов
/ 02 мая 2018

код:

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

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

вы можете сделать это, используя 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
0 голосов
/ 02 мая 2018

Вы можете сделать это с помощью динамического 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; 
0 голосов
/ 02 мая 2018

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

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

Проверка изображение

...