gpt4 book ai didi

mysql - 如何创建显示过去 4 个季度数据的 View ?

转载 作者:行者123 更新时间:2023-11-29 17:45:49 24 4
gpt4 key购买 nike

我的环境是5.1.72-community。

我有一个名为“生产”的表,例如:

 id, person_id, num, p_year, p_quarter
1, 1, 43, 2018, 2
2, 1, 92, 2018, 1
3, 1, 108, 2017, 4
4, 2, 41, 2018, 2
...

到“2018-04-14”时,我们知道季度=2,年份=2018。我定义quarter_1是当年的当前季度,quarter_2是上一季度,依此类推。现在我想创建一个像这样的 View :

 person_id, num_quarter_1, num_quarter_2, num_quarter_3, num_quarter_4
1, 43, 92, 108, 0
2, 41, 0, 0, 0

这样,如果该季度没有num,则填0。

如何创建该 View ?

最佳答案

嗯。如果我将“最后四个季度”解释为“数据中的最后四个季度”,那么这是一种方法。

首先,您可以通过以下方式获得四个季度:

select distinct p_year, p_quarter
from production p
order by p_year desc, p_quarter desc
limit 4;

您可以使用变量枚举它们:

select p_year, p_quarter, (@rn := @rn + 1) as enum
from (select distinct p_year, p_quarter
from production p
order by p_year desc, p_quarter desc
limit 4
) p cross join
(select @rn := 0) params

然后,您可以在查询中使用它来透视数据:

select p.person_id,
sum(case when seqnum = 1 then num else 0 end) as num_quarter_1,
sum(case when seqnum = 2 then num else 0 end) as num_quarter_2,
sum(case when seqnum = 3 then num else 0 end) as num_quarter_3,
sum(case when seqnum = 4 then num else 0 end) as num_quarter_4
from production p join
(select p_year, p_quarter, (@rn := @rn + 1) as seqnum
from (select distinct p_year, p_quarter
from production p
order by p_year desc, p_quarter desc
limit 4
) p cross join
(select @rn := 0) params
) yq
using (p_year, p_quarter)
group by p.person_id;

编辑:

如果您根据当前季度定义季度,则可以执行类似的操作:

select p.person_id,
sum(case when seqnum = 1 then num else 0 end) as num_quarter_1,
sum(case when seqnum = 2 then num else 0 end) as num_quarter_2,
sum(case when seqnum = 3 then num else 0 end) as num_quarter_3,
sum(case when seqnum = 4 then num else 0 end) as num_quarter_4
from production p join
(select year(curdate()) as p_year, quarter(curdate()) as p_quarter, 1 as seqnum union all
select year(curdate() - interval 1 quarter) as p_year, month(curdate() - interval 1 quarter) as p_quarter, 2 as seqnum union all
select year(curdate() - interval 2 quarter) as p_year, month(curdate() - interval 2 quarter) as p_quarter, 3 as seqnum union all
select year(curdate() - interval 2 quarter) as p_year, month(curdate() - interval 3 quarter) as p_quarter, 4 as seqnum
) yq
using (p_year, p_quarter)
group by p.person_id;

还有其他方法,例如:

select person_id,
sum(case when year(curdate()) = p_year and quarter(curdate()) = p_quarter
then num else 0
end) as num_quarter_1,
sum(case when year(curdate() - interval 1 quarter) = p_year and quarter(curdate() - interval 1 quarter) = p_quarter
then num else 0
end) as num_quarter_2,
sum(case when year(curdate() - interval 2 quarter) = p_year and quarter(curdate() - interval 2 quarter) = p_quarter
then num else 0
end) as num_quarter_3,
sum(case when year(curdate() - interval 3 quarter) = p_year and quarter(curdate() - interval 3 quarter) = p_quarter
then num else 0
end) as num_quarter_4
from production p
group by person_id;

关于mysql - 如何创建显示过去 4 个季度数据的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49831313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com