针对可变日期范围返回的多个计数的MySQL查询

时间:2015-10-14 23:49:51

标签: mysql date

我是一个SQL新手,他从一些与我想要的内容相关的例子中脱颖而出,但似乎无法将所有部分组合在一起,甚至无法确认它是否可行查询。我的示例数据结构是:

用户 字段'id'(整数)和'start_date'(日期为YYYY-MM-DD格式)

我正在尝试编写一个查询来返回成员数量('id')的列表,其中'start_date'属于6月1日 - 5月31日的最后一个会计年度。但是,不止于此我想回到上一个财政年度的清单。我能够拼凑起来的最好的是:

SELECT COUNT(user.id) As "Total Members" FROM user WHERE user.start_date BETWEEN '2010-06-01' and '2011-05-31' UNION
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2011-06-01' and '2012-05-31' UNION
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2012-06-01' and '2013-05-31' UNION
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2013-06-01' and '2014-05-31' UNION
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2014-06-01' and '2015-05-31' UNION
SELECT COUNT(user.id) FROM user WHERE user.start_date BETWEEN '2015-06-01' and DATE(CURDATE())

这有两个问题,除了它似乎不优雅。一个是虽然它确实在列中返回了正确的计数,但我需要在相邻列中添加一个引用年份以获得以下内容:

Fiscal Year | Total Members
----------------------------
    2011    |     ####
    2012    |     ####
    2013    |     ####
    2014    |     ####
    2015    |     ####
  CURRENT   |     ####

,当前查询只返回Total Members。其次,我试图在大约40年后(从150,000多个成员记录中)产生这种情况,我觉得通过在某种年份函数上使用修饰符而不是硬编码范围可能有更好的方法(年-1,年-2等)。通过逻辑思考,我也想到了使用正确的范围返回正确的引用而不会过于复杂的潜在问题。任何帮助或建议将不胜感激。我认识到自己的局限性,如果我要编写的内容太复杂而无法维护,我可以坚持使用我现有的示例列表(如果需要,可以追溯到另外40年)。提前感谢所有贡献!

2 个答案:

答案 0 :(得分:0)

我认为你应该使用group by语句:

SELECT
To_number(to_char(user.start_date, 'YYYY')) AS YEAR
,COUNT(user.id) As "Total Members"
FROM user
GROUP BY
To_number(to_char(user.start_date, 'YYYY'))

答案 1 :(得分:0)

您可以通过一些算术和聚合

逐年获得计数
SELECT YEAR(DATE_SUB(u.start_date, interval 5 month)) as fy,
       COUNT(*) As TotalMembers
FROM user u
WHERE user.start_date BETWEEN '2010-06-01' and '2011-05-31' UNION
GROUP BY YEAR(DATE_SUB(u.start_date, interval 5 month))
ORDER BY fy;

我不确定“CURRENT”行应该是什么。

如果您想要所有年份的总数,那么您可以使用with rollup

SELECT COALESCE(CAST(YEAR(DATE_SUB(u.start_date, interval 5 month)) as CHAR(25)),
               'Current') as fy,
       COUNT(*) As TotalMembers
FROM user u
WHERE user.start_date BETWEEN '2010-06-01' and '2011-05-31' UNION
GROUP BY YEAR(DATE_SUB(u.start_date, interval 5 month)) WITH ROLLUP
ORDER BY fy;