首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按半年汇总MySQL表数据?

问如何按半年汇总MySQL表数据?
EN

Stack Overflow用户
提问于 2016-10-01 03:14:37
回答 4查看 2.7K关注 0票数 1

有没有人可以帮我写一个MySQL查询,用于根据每半年一次的日期格式的列记录来划分数据?

我写了GROUP by Monthly和Quarterly的查询,但是半年没有发生。

我对每周、每月和每季度使用以下查询:

代码语言:javascript
复制
CREATE view darren_inventory_mrp_forecast_summary as
    ( SELECT row_number() OVER(ORDER BY sub.product_id) as id,
             SUM(sub.quantity)/12 as quantity,
             SUM(sub2.quantity)/4 as quarterly,
             SUM(sub3.quantity)/51 as weekly,
             sub.product_id as product_id FROM
          (SELECT row_number() OVER(ORDER BY product_id) as id,
                  product_id as product_id,
                  SUM(product_qty) as quantity
          FROM stock_move
          WHERE consumed_for IS NOT NULL
          GROUP BY to_char(DATE(create_date), 'YYYY-MM'), product_id 
          ) 
      as sub 
      LEFT JOIN 
          (SELECT row_number() OVER(ORDER BY product_id) as id,
                  product_id as product_id,
                  SUM(product_qty) as quantity
          FROM stock_move
          WHERE consumed_for IS NOT NULL
          GROUP BY to_char(DATE(create_date), 'YYYY-Q'), product_id 
          ) 
      as sub2 on (sub2.product_id=sub.product_id)  
      LEFT JOIN
          (SELECT row_number() OVER(ORDER BY product_id) as id,
                  product_id as product_id,
                  SUM(product_qty) as quantity
          FROM stock_move
          WHERE consumed_for IS NOT NULL
          GROUP BY to_char(DATE(create_date), 'YYYY-WW'), product_id 
          ) 
      as sub3 on (sub3.product_id=sub.product_id)  
      GROUP BY sub.product_id
    )
EN

回答 4

Stack Overflow用户

发布于 2016-10-01 04:01:34

您可以使用此方法获取日期项出现的月份的第一天。

代码语言:javascript
复制
select last_day(datecolumn) + interval 1 day - interval 1 month 

您可以使用下面的代码获取日期项的年份月份

代码语言:javascript
复制
select month(datecolumn)

您可以像这样获得半年(0-5)的月数

代码语言:javascript
复制
select (month(datecolumn) -1) mod 6

所以,你可以像这样得到半年的第一天。

代码语言:javascript
复制
select last_day(datecolumn) + interval 1 day - interval 1 month
        - interval (month(datecolumn) -1) mod 6 month

然后,您可以根据这个大表达式进行分组,并以这种方式总结您的数据。

这也是可行的:

代码语言:javascript
复制
select last_day(datecolumn) + interval 1 day - interval 1 month
      - interval (quarter(datecolumn) -1) mod 2 quarter

诀窍是想出一个表达式,将任何日期时间表达式截断到它所在的半年的第一天。

如果您只想处理特定年份的内容,可以这样做。

代码语言:javascript
复制
  WHERE datecolumn >= DATE_FORMAT(NOW(), '%y-01-01') - INTERVAL 1 YEAR
    AND datecolumn >  DATE_FORMAT(NOW(), '%y-01-01') + INTERVAL 1 YEAR

此特定示例选择2015和2016日历年中的所有内容。表达式DATE_FORMAT(someTimestampValue, '%y-01-01')将日期或日期时间值截断到日历年的开始。

票数 2
EN

Stack Overflow用户

发布于 2018-02-28 18:01:58

MySql中没有half_year函数,但可以从quarter开始计算:

floor( quarter (date_column) / 3)这个函数返回0表示1,2季度,1表示3,4季度。

因此,按半年分组:

代码语言:javascript
复制
GROUP BY year(date_column) + 0.1 * floor(quarter(date_column) / 3)
票数 0
EN

Stack Overflow用户

发布于 2020-04-28 02:10:58

我首先通过按年分组来解决这个问题,然后聚合季度,以便第一季度和第二季度返回1,第三季度和第四季度返回2。

代码语言:javascript
复制
GROUP BY YEAR(date_column), CEILING(QUARTER(date_column) / 2)

如果您只想按半年为1或2进行分组,则可以跳过年份(Date_column)部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39798591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档