сводные данные в mysql на основе дат и значений столбцов - PullRequest
0 голосов
/ 26 марта 2020

У меня есть данные в следующем формате:

  Date.       Comapany col3.    Quantity
'01/01/2018',  'CompA','x','10'
'12/01/2017',  'CompA','x','20'
'11/01/2017',  'CompA','x','30'
'10/01/2017',  'CompA','x','40'
'01/01/2018',  'CompB','x','40'
'12/01/2017',  'CompB','x','20'
'11/01/2017',  'CompB','x','30'
'10/01/2017',  'CompB','x','40'

Я хочу перевести данные в приведенный ниже формат, я попытался повернуть, но это не сработало.

Может кто-нибудь помочь мне здесь? Все мои значения col совпадают

Требуемый вывод:

Company col3    date    PeriodValue Lastmonth   last_to_last
A   x        01/01/2018     10         20        30
A   x        12/01/2017     20         30        40
A   x        11/01/2017     30         40        0
A   x        10/01/2017     40          0        0
B   x        01/01/2018     40         20        30
B   x        12/01/2017     20         30        40
B   x        11/01/2017     30         40        0
B   x        10/01/2017     40          0        0

query

select inr.date,inr.Company,inr.col3 , sum(inr.value)  as Periodvalue  ,
sum(case when period=STR_TO_DATE(inr.period,'%m/%d/%Y') -INTERVAL 1 MONTH  THEN inr.value else 0 end) as Lastmonth,
sum(case when period=STR_TO_DATE(inr.period,'%m/%d/%Y') -INTERVAL 2 MONTH  THEN inr.value else 0 end) as last_to_last from (
select concat(SUBSTRING(Period, 5, 6),"/","01","/",SUBSTRING(Period, 1, 4)) as period,Company,Metric,v1 as value
from test2.q3) inr
group by inr.period,inr.Company,inr.Metric  order by period

myoutput


Company col3    date    PeriodValue Lastmonth   last_to_last
A   x        01/01/2018     10         10        30
A   x        12/01/2017     20         20        20
A   x        11/01/2017     30         30        30
A   x        10/01/2017     40         40        40
B   x        01/01/2018     40         40        40
B   x        12/01/2017     20         20        20
B   x        11/01/2017     30         30        30
B   x        10/01/2017     40         40       40

моя проблема похожа на эту

1 Ответ

0 голосов
/ 26 марта 2020

В зависимости от вашей версии MySql вы можете легко достичь желаемого с помощью оконных функций.

Предполагая, что ваши входные данные - это те данные, которые вы предоставили из таблицы в формате:

CREATE TABLE test
(`Date` date,
 Company varchar(32),
 col3 varchar(1),
 Quantity int
);

Вы можете запустить это, чтобы получить то, что вы хотите:

select RIGHT(Company,1) as Company
,col3
,`Date`
,Quantity as PeriodValue
,LAG(Quantity,1)OVER (PARTITION BY Company ORDER BY `Date` ASC) LastMonth
,LAG(Quantity,2)OVER (PARTITION BY Company ORDER BY `Date` ASC ) SecondtoLastMonth
from test
ORDER BY Company ASC,`Date` DESC
...