访问SQL滚动12个月不同计数

时间:2014-03-10 22:06:25

标签: sql ms-access count distinct

我在MS Access中有两个表,一个日期只有几个月和几年的列表,例如:

MonthNumber YearNumber 1 2013 2 2013 3 2013

第二个表是 Bedfile ,其中列出了客户名称代码,日期,月份和年份,例如:

Namecode Date Month Year Bob 1/1/2013 1 2013 Joe 1/1/2013 1 2013 Bob 1/2/2013 1 2013 Joe 1/2/2013 1 2013 Eric 1/2/2013 1 2013 Bob 2/15/2013 2 2013 Joe 2/16/2013 2 2013 Bob 2/1/2014 2 2014 Joe 2/1/2014 2 2014

我正在寻找什么

我目前正在尝试进行查询,以计算之前十二个月的不同名称代码,例如:

MonthResults YearResults CountResults 1 2013 3 2 2013 3 2 2014 2

这将是一个滚动查询,这意味着结果列将显示在12个月之前找到的名称代码的数量。

我的第一次 SQL尝试是:

SELECT dates.monthnumber, dates.yearnumber, ( SELECT Count(a.namecode) FROM (SELECT DISTINCT bedfile.namecode FROM BEDFILE WHERE bedfile.date BETWEEN dateserial(dates.yearnumber-1, dates.monthnumber, datepart("d", bedfile.date)) AND dateserial(dates.yearnumber, dates.monthnumber, datepart("d", bedfile.date)) ) as a ) FROM dates GROUP BY dates.yearnumber, dates.monthnumber

当我运行它时,它会问我date.yearnumber和date.monthnumer是什么。如果我输入数字(分别是2013年和1),它只给我一个月的独特数量。

我的第二次尝试是:

SELECT Count(a.namecode), dates.monthnumber, dates.yearnumber FROM (SELECT DISTINCT bedfile.namecode, bedfile.month, bedfile.year FROM BEDFILE WHERE bedfile.date BETWEEN dateadd("yyyy", -1, bedfile.date) and bedfile.date ) AS a INNER JOIN dates ON (a.month=dates.monthnumber) AND (a.year=dates.yearnumber) GROUP BY dates.yearnumber, dates.monthnumber;

第二个查询给了我不同的计数,但仅限于每个月,而不是前一个12的总和。

有谁知道如何帮助我创造我正在寻找的东西?甚至可以在Access SQL查询中使用吗?

1 个答案:

答案 0 :(得分:0)

SELECT
    first_date,
    second_date,
    COUNT(name) as num_distinct,
    name
FROM(
    SELECT 
        DISTINCT b.namecode AS name,
        b.date AS first_date,
        DateAdd("yyyy",-1,[b.date]) AS second_date
    FROM bedfile b
    WHERE b.date BETWEEN DateAdd("yyyy",-1,[b.date]) AND b.date
)
GROUP BY name

不确定这是否正确,因为我从未使用MS Access SQL,但看起来这样可行


编辑:

你说这个查询

SELECT Count(a.namecode), dates.monthnumber, dates.yearnumber
FROM 
   (SELECT DISTINCT bedfile.namecode, bedfile.month, bedfile.year 
   FROM BEDFILE 
   WHERE bedfile.date 
   BETWEEN dateadd("yyyy", -1, bedfile.date) and bedfile.date
   )  AS a 
INNER JOIN dates 
ON (a.month=dates.monthnumber) AND (a.year=dates.yearnumber)
GROUP BY dates.yearnumber, dates.monthnumber;

每月返回不同的计数,所以为什么不用另一个选择包含计数的SUM()的选项来包装它以获得每年的总和? 您可以做的另一件事是删除GROUP BY dates.monthnumber ....因为这将按月拆分数据而不是显示一年。

我建议按年分组,因为它更少编写sql并且更易于阅读。