【问题标题】:Dynamically Create/Select Rows of Dates in MySQL在 MySQL 中动态创建/选择日期行
【发布时间】:2015-04-02 21:19:38
【问题描述】:

使用以下嵌套的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 2014 结束,因为April 2015February 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 个整数。

【问题讨论】:

  • 你能多谈谈你的用法吗?我的意思是,在日期字段上进行分组会很简单,并且使用 MySQL 生成一堆没有额外数据的月份会有些荒谬,所以这个问题可能会在更多上下文中得到更好的回答。
  • @JohnGreen 我已经用查询的应用更新了我的问题。
  • 啊,所以你有差距,由你试图避免的 GROUP BY 引起。你在做观点吗?这对于动态 SQL 来说是微不足道的。

标签: mysql


【解决方案1】:

我相信你可以用这个

您可以通过更改“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

【讨论】:

  • 您的“缺点”是问题所在。我希望最后 6 个月同时进行,即使该月返回 NULL 或 0 金额。
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多