Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何创建显示最近4个季度数据的视图?_Mysql_Sql - Fatal编程技术网

Mysql 如何创建显示最近4个季度数据的视图?

Mysql 如何创建显示最近4个季度数据的视图?,mysql,sql,Mysql,Sql,我的环境是5.1.72-community 我有一个名为production的表,如: 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年4月14日,我们知道季度=2,年份=2018。我将季度_1定义为本年度的当前季度,季度_2定义为上一季度,依此类推。现在我想创建一个视图,如: pers

我的环境是5.1.72-community

我有一个名为production的表,如:

 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年4月14日,我们知道季度=2,年份=2018。我将季度_1定义为本年度的当前季度,季度_2定义为上一季度,依此类推。现在我想创建一个视图,如:

 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

如何创建该视图?如果我将“最后四个季度”解释为“数据中的最后四个季度”,那么这里有一种方法

首先,您可以通过执行以下操作获得四个四分之一:

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;

您最好将日期信息存储为日期,而不是单独的年度和季度。“最后四个季度”是什么意思?数据中最近的4个?基于时间?对于每个人?@GordonLinoff,我认为这是指截至目前的最近四个季度。但是那一年和那一季度是分开的数字,让人觉得现在不想做SQL奥运会。@TimBiegeleisen谢谢,但我需要这一年和那一季度作为唯一的索引。@GordonLinoff对不起,我没有清楚地描述它。这意味着按照自然时间,如果现在是“2018-04-14”,那么最后4个季度是:2018-Q2、2018-Q1、2017-Q4、2017-Q3。如果现在是“2017-09-10”,那么最后4个季度是:2017-Q3、2017-Q2、2017-Q1、2016-Q4。谢谢,我现在知道了。我也会把yq放在一个角度。
SELECT
    person_id,
    SUM((p_quarter = 1) * num) as num_quarter_1,
    SUM((p_quarter = 2) * num) as num_quarter_2,
    SUM((p_quarter = 3) * num) as num_quarter_3,
    SUM((p_quarter = 4) * num) as num_quarter_4
FROM production
WHERE p_year = 2018
GROUP BY person_id;