使用以下嵌套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个整数。
答案 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