【发布时间】: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 5 和 LIMIT 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 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 个整数。
【问题讨论】:
-
你能多谈谈你的用法吗?我的意思是,在日期字段上进行分组会很简单,并且使用 MySQL 生成一堆没有额外数据的月份会有些荒谬,所以这个问题可能会在更多上下文中得到更好的回答。
-
@JohnGreen 我已经用查询的应用更新了我的问题。
-
啊,所以你有差距,由你试图避免的 GROUP BY 引起。你在做观点吗?这对于动态 SQL 来说是微不足道的。
标签: mysql