Строки в столбцы 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, я не уверен, как это сделать. Я возился с некоторым кодом в следующей демонстрации скрипки, но он не совсем делает то, что я хочу. Я ценю вашу помощь.

http://sqlfiddle.com/

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.

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