在MySQL中动态创建/选择日期行

时间:2015-04-02 21:19:38

标签: mysql

使用以下嵌套SELECT ... UNION SELECT ...查询,我可以返回过去6个月(包括当月)的月/年行

SELECT month_year
FROM
  (SELECT DATE_FORMAT(NOW(),'%M %Y') as month_year
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH),'%M %Y')
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 MONTH),'%M %Y')
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 3 MONTH),'%M %Y')
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 4 MONTH),'%M %Y')
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 5 MONTH),'%M %Y')
    ) a

结果 -

month_year
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014

是否可以重新创建此查询以便动态创建,即不必添加/删除UNION SELECT ...以获得更多/更少的月/年行?

显然,以下查询不起作用,但有一些方法可以做 -

SELECT month_year
FROM
  (SELECT DATE_FORMAT(`thisDate`,'%M %Y') as month_year WHERE `thisDate` BETWEEN NOW() AND DATE_SUB(NOW(), INTERVAL 5 MONTH) LIMIT 6
  ) a

我只需要更改INTERVAL 5LIMIT 6整数来更改返回的行数。


应用

如果我有一张表sales,每行是当天销售的金额。

date          amount
2015-01-03    100
2015-01-10    50
2015-03-07    75
2015-03-14    60
2015-03-21    40
...
2014-10-31    125

现在我希望获得过去6个月的每月总数。如果我使用LIMIT 6

执行标准查询
SELECT
   DATE_FORMAT(date,'%M %Y') as month_year, SUM(amount)
FROM
   sales
GROUP BY
   month_year
LIMIT 6

由于October 2014April 2015没有行,我最终会收到February 2015

所以我的想法是创建一个日期行的“临时”表格,然后LEFT JOIN我的sales查询 -

SELECT a.month_year, b.amount
FROM
  (SELECT DATE_FORMAT(NOW(),'%M %Y') as month_year
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH),'%M %Y')
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 MONTH),'%M %Y')
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 3 MONTH),'%M %Y')
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 4 MONTH),'%M %Y')
   UNION
   SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 5 MONTH),'%M %Y')
  ) a
LEFT JOIN 
  (SELECT
       DATE_FORMAT(date,'%M %Y') as month_year, SUM(amount)
   FROM
       sales
   GROUP BY
       month_year
   ) b
 ON b.month_year = a.month_year

但是,如果我想将月份更改为7,8,9或3,4,5,我将不得不添加/删除行,我希望能够只更改1或2个整数。

1 个答案:

答案 0 :(得分:0)

我相信你可以使用这个

您可以通过更改“INTERVAL XX MONTH”来设置搜索的年龄。

下行方面是:如果您最终有一个月没有销售,则该月份将不会出现在查询结果中。

SELECT
MONTH(`date`) AS period,
SUM(ammount) AS clicks
FROM `sales`
WHERE `date` >= CURDATE() - INTERVAL 10 MONTH
GROUP BY period

致谢:Group by date range on weeks/months interval