I have following data structure for sales:
x
id year M01 M02 M03 M04 M05 M06 M07 M08 M09 M10 M11 M12
1 2020 0 5 4 0 10 0 0 0 0 0 0 0
1 2019 4 3 0 0 6 0 7 0 8 0 0 10
2 2020 0 5 4 0 10 0 0 0 0 0 0 0
2 2019 4 3 0 0 6 0 7 0 8 0 0 10
I need to know how many products with id=1 were sold for the last 12 month. If we are in June 2020 I need to sum M01, M02, M03, M04, M05 (WHERE year=2020) and M06, M07, M08, M09, M10, M11, M12 (WHERE year=2019) WHERE id=1. I should get a value of 36.
Please, any suggestions on how to do that in MySQL?
Advertisement
Answer
You need to fix your data model. Unpivot and then aggregate:
with reasonable_format as (
select id, year, str_to_date(concat(year, '-01-01'), '%Y-%m-%d') as date, m01 as amount from sales union all
select id, year, str_to_date(concat(year, '-02-01'), '%Y-%m-%d') as date, m02 from sales union all
. . .
select id, year, str_to_date(concat(year, '-02-01'), '%Y-%m-%d') as date, m12 from sales
)
select sum(amount)
from reasonable_format rf
where id = 1 and date <= curdate - interval 1 year;
reasonable_format
is what your data should look like.