Строки в столбцы mysql
У меня есть таблица с 1000 городами, в которых сообщается о 3 переменных среды (переменная1, переменная2, переменная3) в день1... день30. Вот пример таблицы.
create table myTable1 (dt date, City varchar(15), type varchar(10),
Day1 int, Day2 int, Day3 int);
insert into myTable1 values
('2014-09-19','Toronto','Variable1', 100,90,80),
('2014-09-19','Toronto','Variable2', 20,15,10),
('2014-09-19','Toronto','Variable3', 3,2,1),
('2014-09-19','Chicago','Variable1', 999,888,777),
('2014-09-19','Chicago','Variable2', 500,400,300),
('2014-09-19','Chicago','Variable3', 300,250,200);
Я хочу манипулировать им, чтобы конечный результат был в следующей структуре. Я хочу, чтобы новый столбец, Day, который принимает значение дня (т. Е. 1, 2 ... 30) и значения внутри столбца с именем type, стал столбцами (то есть 3 столбца с именем Variable1, Variable2, Variable3).
dt, City, Day, Variable1, Variable2, Variable3
2014-09-19, Toronto, 1, 100, 20, 3
2014-09-19, Toronto, 2, 90, 15,2
2014-09-19, Toronto, 3, 80, 10, 1
2014-09-19, Chicago, 1, 999,500,300
2014-09-19, Chicago, 2, 888,400, 250
2014-09-19, Chicago, 3, 777,300,200
Я знаю, что я могу сделать это на сервере sql согласно решению в unpivot значения строки в несколько столбцов. Так как у MySQL нет pivot/unpivot, я не уверен, как это сделать. Я возился с некоторым кодом в следующей демонстрации скрипки, но он не совсем делает то, что я хочу. Я ценю вашу помощь.
1 ответ
Это сложная условная агрегация:
select t.dt, t.city, d.day,
max(case when d.day = 1 and t.type = 'Variable1' then day1
when d.day = 2 and t.type = 'Variable1' then day2
when d.day = 3 and t.type = 'Variable1' then day3
end) as Variable1,
max(case when d.day = 1 and t.type = 'Variable2' then day1
when d.day = 2 and t.type = 'Variable2' then day2
when d.day = 3 and t.type = 'Variable2' then day3
end) as Variable2,
max(case when d.day = 1 and t.type = 'Variable3' then day1
when d.day = 2 and t.type = 'Variable3' then day2
when d.day = 3 and t.type = 'Variable3' then day3
end) as Variable3
from mytable1 t cross join
(select 1 as day union all select 2 union all select 3) d
group by t.dt, t.city, d.day;
Вы можете увидеть эту работу в своей скрипте SQL.