MySql如何比较今年和去年的月份?

时间:2012-12-01 20:28:24

标签: mysql date

如何找到今年2月份销售额增加20%以上的部门编号(与今年相比,将使用年份(CURDATE())而不是“2012”)与去年2月相比前一年。结果表应该只有一列,其中包含的销售额增加了20%的部门编号。

如果去年的febraury没有“部门2”的销售但是这个febraury的销售,那么0 * 1.2 = 0所以结果不会显示“部门2”。如果去年2月的“第3部”出售了一件商品,并且今年2月份卖出了两件商品,这将是1.5增加,超过1.2,所以结果应显示“部门3”。如果只有3个部门,最多只能有3个部门。

部门2没有出现,因为去年2月有3次销售,2月有1次销售。部门4没有出现,因为去年2月没有销售,所以在数学0 * 1.2 = 0的情况下,所以尽管有这个febraury有销售,但部门4不会出现。

提前谢谢你,希望这足够详细。

2 个答案:

答案 0 :(得分:1)

这使用 MAKEDATE() 功能来赢取一年的第一天,然后添加适当的月间隔来计算(二月)月的开始和下一个月的开始日期月。

?替换为1表示1月,2表示2月表示等等:

SELECT 
    this_year.departement_no
FROM  
      ( SELECT departement_no, COUNT(*) AS num_sales
        FROM department
        WHERE date >= MAKEDATE( YEAR(NOW()), 1) + INTERVAL (?-1) MONTH
          AND date < MAKEDATE( YEAR(NOW()), 1) + INTERVAL (?) MONTH
        GROUP BY departement_no
      ) this_year
    LEFT JOIN
      ( SELECT departement_no, COUNT(*) AS num_sales
        FROM department
        WHERE date >= MAKEDATE( YEAR(NOW())-1, 1) + INTERVAL (?-1) MONTH
          AND date < MAKEDATE( YEAR(NOW())-1, 1) + INTERVAL (?) MONTH
        GROUP BY departement_no
      ) last_year
          ON  last_year.departement_no = this_year.departement_no
WHERE 
    this_year.num_sales > 1.2 * COALESCE(last_year.num_sales, 0) ;

如果您希望(作为您相当奇怪的要求)不显示今年2月销售并且去年没有销售的部门,请删除COALESCE()功能。您还可以将LEFT加入更改为INNER加入:

WHERE 
    this_year.num_sales > 1.2 * last_year.num_sales ;

答案 1 :(得分:0)

尝试使用having,如下所示:

    select departement_no
    from department
    group by departement_no
    having sum(case date_format(date, '%m%Y') 
                when CONCAT('02',YEAR(CURDATE())) then 1 else 0 end) 
           >
           1.2 * sum(case date_form(date, '%m%Y') 
                     when CONCAT('02',YEAR(DATE_SUB(CURDATE(),INTERVAL 1 Year)))
                     then 1 else 0 end)
         AND 
         sum(case date_form(date, '%m%Y') 
                     when CONCAT('02',YEAR(DATE_SUB(CURDATE(),INTERVAL 1 Year)))
                     then 1 else 0 end) > 0