根据动态的开始月份,按季度对多个季度进行分组

时间:2014-02-03 11:38:32

标签: mysql

使用 MySQL PHP 我正在构建一个 JSON 数组来填充数据表。

出于我的问题的目的,假设数据表包含以下列:

Year: 2010,2011,2012,2013...<br/>
Month: 1,2,3,4,5...<br/>
Value: 100, 150, 200 etc...<br/>

表结构无法更改,我的解决方案需要进入MySQL查询

可以按月,按季或按年查看数据。通过按年和月分组,可以轻松实现月度和年度。

季度数据可按日历季度(1月至3月,4月至6月,7月至9月,10月至12月)按此群组声明进行分组:

GROUP BY year, round((month/3)+0.3,0)

因此,1月,2月和3月的价值可能都是100,总计结果为300,其他月份相同。

现在我的问题出现在我希望按财务季度对价​​值进行分组,例如从2月开始的季度或任何其他季度。

我有一个声明适用于季度分组,使用两个可以通过SQL查询,start_year(即2014)和start_month(即2)访问的变量

GROUP BY year, (((round(((((month-(start_month-1))+((year-start_year)*12))-((year-start_year)*12))/3)+0.33,0)/4)+4)-floor(((round(((((month-(start_month, '%m')-1))+((year-start_year)*12))-((year-start_year*12))/3)+0.33,0)/4)+4)))*12  

基本上会为每个日历月分配一个0,3,6,9值,以便进行分组。

在2月份开始的财政年度,这个季度的工作正常,在1-3季度,但最后一个季度会有所突破,因为它包括2014年11月和12月的数据以及2015年1月的数据。

结果我获得了5行数据而不是4行。

这是因为前面的GROUP by year子句是一个重要的补充,因为我们可能希望生成一个查看多年连续季度的表。

所以我正在寻找的是通过抵消开始月份将这些年份分组在一起的方法。

因此,当年份从1月份开始时,它将分组1月至12月,但如果我们将其更改为2月开始,它将分组2月至1月。

任何想法,建议都欢迎!

此致 卡尔

1 个答案:

答案 0 :(得分:0)

我刚刚解决了类似的问题(Moodle报告按年份和季度汇总了作业分数),如下所示:

select year(from_unixtime(s.timemarked)) as year, quarter(from_unixtime(s.timemarked)) % 4 + 1 as quarter, count(distinct data1) as "tickets graded" from mdlassignment_submissions s where grade >= 0 group by year, quarter order by year, quarter;

您正在做的事情的相关部分是quarter(from_unixtime(s.timemarked)) % 4 + 1 as quarter

正如另一位评论者指出的那样,MySQL具有quarter()功能,但它并没有进行财务管理。但是,由于(据我所知,至少在咨询相关的维基百科页面时),财务季度只是偏移1,最后的% 4 + 1应该转换它。