2016-10-21 3 views
0

Может кто-нибудь помочь мне в этом? Как вы можете видеть на первом снимке (Исходные данные), у меня есть дата в формате «Мар-12» и данные за 2014,2015,2016 и 2017 год. Теперь мне нужно вставить новый столбец «год», где мне нужно поставить год с января по 14 января, янв-15, янв-16, фев-16 и т. Д. В принципе, мне нужно какое-то преобразование данных, я думаю , Во второй картине «Окончательный заказ» я показываю, в каком порядке мне нужны данные.Транспонировать данные в SQL

enter image description here

enter image description here


Я не знаю, что это DBMS. Таким образом, это как мои данные (оригинальное) выглядит следующим образом:

Customer|Section|Data|Jan-14|Feb-14|Jan-15|Feb-15 

Total Fore  SR 10  20  30  35 
Total Fore  TK 5  4  12  10 
=================================================== 

И мне нужно поместить данные в этой форме:

Customer|Section|Data| Year |Jan|Feb| 

Total  Fore SR 2014 10 20 
Total  Fore TK 2014 5 4 
Total  Fore SR 2015 30 35 
Total  Fore TK 2015 12 10 
+2

Какой у вас dbms? – jarlh

+3

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –

+0

Мой экран слишком маленький. Упростите/минимизируйте проблему. – jarlh

ответ

0

Учитывая Ваш образец

create table t (Customer varchar(5),Section varchar(4), Data varchar(2), [Jan-14] int , [Feb-14] int, [Jan-15] int, [Feb-15] int) 
insert into @t values 
('Total' , 'Fore' , 'SR' , 10 , 20,  30,  35), 
('Total' , 'Fore' , 'TK' , 5 ,  4,  12,  10) 

вы можете решить эту проблему, если ваш sql-диалект является ms sql-сервером, отключая его, а затем группируя его так

select customer,section,data,yyyy, 
      sum(case when mm='Jan' then dts else 0 end) as 'Jan', 
      sum(case when mm='Feb' then dts else 0 end) as 'Feb' 
from 
(
select  customer,section,data, 
      dummy, 
      substring(dummy,1,3) as mm, 
      concat('20',substring(dummy,5,2)) as yyyy, 
      dts 
from 
(
select customer,section,data, 
     [Jan-14] , [Feb-14] , [Jan-15] , [Feb-15] 
from t 
) pvt 
UNPIVOT 
    (dts FOR dummy IN 
     ([Jan-14] , [Feb-14] , [Jan-15] , [Feb-15]) 
)AS unpvt 
) x 
group by customer,section,yyyy,data 

результат

customer section data yyyy Jan   Feb 
-------- ------- ---- ---- ----------- ----------- 
Total Fore SR 2014   10   20 
Total Fore TK 2014   5   4 
Total Fore SR 2015   30   35 
Total Fore TK 2015   12   10 

Если ваш SQL диалект не имеет UNPIVOT вы можете

select customer,section,data,yyyy, 
      sum(case when mm='Jan' then dts else 0 end) as 'Jan', 
      sum(case when mm='Feb' then dts else 0 end) as 'Feb' 
from 
( 
select customer,section,data,2014 as yyyy,'Jan' as mm,[Jan-14] as dts from t 
union all 
select customer,section,data,2014 as yyyy,'Feb' as mm,[Feb-14] as dts from t 
union all 
select customer,section,data,2015 as yyyy,'Jan' as mm,[Jan-15] as dts from t 
union all 
select customer,section,data,2015 as yyyy,'Feb' as mm,[Feb-15] as dts from t 
) x 
group by customer,section,yyyy,data 

Очевидно либо метод является боль, если у вас есть неизвестные/переменное число/много столбцов в в этом случае вам понадобится написать сценарий для создания оператора sql для отправки в динамический sql.

Смежные вопросы