2

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

如果去年 2 月没有“部门 2”的销售额,但有今年 2 月的销售额,则 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 所以部门 4 不会出现,尽管今年 2 月有销售。

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

4

2 回答 2

1

这使用MAKEDATE()函数来创建一年的第一天,然后添加适当的月份间隔来计算(二月)月份的开始和下个月的开始日期。

用 1代替?一月,用 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 ;
于 2012-12-01T23:12:04.370 回答
1

尝试使用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
于 2012-12-01T20:43:31.813 回答